- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
TL;DR:我做错了什么导致工作区 Pane 出现在 Inspect Objects 中但没有出现在我的自定义代码中?
我正在尝试为第 3 方程序编写一些 UI 自动化。我正在使用 Inspect.exe Windows SDK 附带的, 我都试过了 System.Windows.Automation并直接COM Calls (使用来自 UIA Verify 的包装器库)。
Process[] processes = Process.GetProcessesByName("Redacted Client");
if (processes.Length == 0) throw new Exception("Could not find \"Redacted Client\" process");
PropertyCondition parentFileCond = new PropertyCondition(AutomationElement.ProcessIdProperty, processes[0].Id);
PropertyCondition workspaceCond = new PropertyCondition(AutomationElement.NameProperty, "Workspace", PropertyConditionFlags.IgnoreCase);
PropertyCondition documentCond = new PropertyCondition(AutomationElement.NameProperty, "Untitled3", PropertyConditionFlags.IgnoreCase);
var parentElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, parentFileCond);
var workspaceElement = parentElement.FindFirst(TreeScope.Children, workspaceCond); //Also does not work with TreeScope.Descendants
var documentElement = workspaceElement.FindFirst(TreeScope.Children, documentCond);
当我尝试上面的代码时,parentElement
确实具有对主程序窗口的正确引用,但是 workspaceElement
为空。
如果我将 documentElement
代码更改为:
var documentElement = parentElement.FindFirst(TreeScope.Descendants, documentCond);
我将返回正确的元素。我可以使用它作为解决方法,因为文档窗口无论如何都是我真正想要的,但我想知道为什么工作区 Pane 不会显示,以便我可以提高我的技能,以防将来遇到这个问题我无法解决的情况。
更新:我尝试了 MrGomez 的建议
PropertyCondition parentFileCond = new PropertyCondition(AutomationElement.ProcessIdProperty, 5872);
PropertyCondition panelCond = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Pane);
var parentElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, parentFileCond);
var panels = parentElement.FindAll(TreeScope.Children, panelCond);
我得到 3 个结果,不幸的是,我有 4 个面板,没有显示的是名为 Workspace
的面板。
我还尝试使用 TreeWalker
PropertyCondition parentFileCond = new PropertyCondition(AutomationElement.ProcessIdProperty, 5872);
PropertyCondition workspaceCond= new PropertyCondition(AutomationElement.NameProperty, "Workspace");
var walker = new TreeWalker(workspaceCond);
var parentElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, parentFileCond);
var workspaceElement = walker.Normalize(parentElement);
但这也会为 workspaceElement
无奈之下,我从Inspect中尝试了“NativeWindowHandle”的当前值,从根节点开始遍历。
PropertyCondition workspaceCond = new PropertyCondition(AutomationElement.NativeWindowHandleProperty, 0x110906);
var walker = new TreeWalker(workspaceCond);
var workspaceElement = walker.Normalize(AutomationElement.RootElement);
工作区元素仍然为空。
我终于让 Workspace 出现了,但我不得不执行
PropertyCondition workspaceCond = new PropertyCondition(AutomationElement.NativeWindowHandleProperty, 0x110906);
var test = AutomationElement.RootElement.FindFirst(TreeScope.Subtree, workspaceCond);
而且运行需要相当长的时间。
这是显示 TreeView 的 Inspect.exe 的屏幕截图。
这是程序主窗口的属性。
How found: Selected from tree...
RuntimeId: "[42.2557552]"
BoundingRectangle: {l:75 t:1 r:1311 b:1003}
ProcessId: 8160
ControlType: UIA_WindowControlTypeId (0xC370)
LocalizedControlType: "window"
Name: "Redacted"
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: true
IsEnabled: true
ClassName: "C:\Program Files (x86)\RedactedProgramFiles7\RedactedClientFolder"
HelpText: ""
IsPassword: false
NativeWindowHandle: 0x270670
IsOffscreen: false
FrameworkId: "Win32"
ProviderDescription: "[pid:4000,hwnd:0x270670 Main:Nested [pid:8160,hwnd:0x270670 Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main:Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]; Nonclient:Microsoft: Non-Client Proxy (unmanaged:uiautomationcore.dll); Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
Window.CanMaximize: true
Window.CanMinimize: true
Window.WindowVisualState: Normal (0)
Window.WindowInteractionState: ReadyForUserInteraction (2)
Window.IsModal: false
Window.IsTopmost: false
Transform.CanMove: true
Transform.CanResize: true
Transform.CanRotate: false
LegacyIAccessible.ChildId: 0
LegacyIAccessible.DefaultAction: ""
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "Redacted"
LegacyIAccessible.Role: client (0xA)
LegacyIAccessible.State: focusable (0x100000)
LegacyIAccessible.Value: ""
IsDockPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: false
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollPatternAvailable: false
IsScrollItemPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsTablePatternAvailable: false
IsTableItemPatternAvailable: false
IsTextPatternAvailable: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: true
IsValuePatternAvailable: false
IsWindowPatternAvailable: true
IsItemContainerPatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
FirstChild: "Workspace" pane
LastChild: "Application" menu bar
Next: "Inspect (HWND: 0x01700F06)" window
Previous: "Sandbox Console (Debugging) - Microsoft Visual Studio (Administrator)" window
Other Props: Object has no additional properties
Children: "Workspace" pane
(null) title bar
"Application" menu bar
Ancestors: "Desktop" pane
[ No Parent ]
这里是问题“工作区” Pane 的属性。
How found: Selected from tree...
RuntimeId: "[42.34146524]"
BoundingRectangle: {l:83 t:51 r:1303 b:995}
ProcessId: 8160
ControlType: UIA_PaneControlTypeId (0xC371)
LocalizedControlType: "pane"
Name: "Workspace"
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: true
IsEnabled: true
ClassName: "MDIClient"
HelpText: ""
IsPassword: false
NativeWindowHandle: 0x20908DC
IsOffscreen: false
FrameworkId: "Win32"
ProviderDescription: "[pid:4000,hwnd:0x20908DC Main:Nested [pid:8160,hwnd:0x20908DC Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main:Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]; Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
LegacyIAccessible.ChildId: 0
LegacyIAccessible.DefaultAction: ""
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "Workspace"
LegacyIAccessible.Role: client (0xA)
LegacyIAccessible.State: focusable (0x100000)
LegacyIAccessible.Value: ""
IsDockPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: false
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollPatternAvailable: false
IsScrollItemPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsTablePatternAvailable: false
IsTableItemPatternAvailable: false
IsTextPatternAvailable: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: false
IsValuePatternAvailable: false
IsWindowPatternAvailable: false
IsItemContainerPatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
FirstChild: "Untitled3" window
LastChild: "Letters (32638 of 32638):" window
Next: (null) title bar
Previous: [null]
Other Props: Object has no additional properties
Children: "Untitled3" window
"Letters (32638 of 32638):" window
Ancestors: "Redacted" window
"Desktop" pane
[ No Parent ]
这里是“工作”文档窗口的属性。
How found: Selected from tree...
RuntimeId: "[42.9505096]"
BoundingRectangle: {l:85 t:53 r:651 b:491}
ProcessId: 8160
ControlType: UIA_WindowControlTypeId (0xC370)
LocalizedControlType: "window"
Name: "Untitled3"
AccessKey: ""
HasKeyboardFocus: false
IsKeyboardFocusable: true
IsEnabled: true
AutomationId: "10"
ClassName: "ProToolsSubMDIWndClass"
HelpText: ""
IsPassword: false
NativeWindowHandle: 0x910948
IsOffscreen: false
FrameworkId: "Win32"
ProviderDescription: "[pid:4000,hwnd:0x910948 Main:Nested [pid:8160,hwnd:0x910948 Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main:Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]; Nonclient:Microsoft: Non-Client Proxy (unmanaged:uiautomationcore.dll); Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
Window.CanMaximize: true
Window.CanMinimize: true
Window.WindowVisualState: Normal (0)
Window.WindowInteractionState: ReadyForUserInteraction (2)
Window.IsModal: false
Window.IsTopmost: false
Transform.CanMove: true
Transform.CanResize: true
Transform.CanRotate: false
LegacyIAccessible.ChildId: 0
LegacyIAccessible.DefaultAction: ""
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "Untitled3"
LegacyIAccessible.Role: client (0xA)
LegacyIAccessible.State: focusable (0x100000)
LegacyIAccessible.Value: ""
IsDockPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: false
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollPatternAvailable: false
IsScrollItemPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsTablePatternAvailable: false
IsTableItemPatternAvailable: false
IsTextPatternAvailable: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: true
IsValuePatternAvailable: false
IsWindowPatternAvailable: true
IsItemContainerPatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
FirstChild: "" thumb
LastChild: (null) title bar
Next: "Letters (32638 of 32638):" window
Previous: [null]
Other Props: Object has no additional properties
Children: "" thumb
(null) title bar
Ancestors: "Workspace" pane
"Redacted" window
"Desktop" pane
[ No Parent ]
最佳答案
非常好的问题。根据您记录的问题,很明显您的条件:
PropertyCondition workspaceCond = new PropertyCondition(
AutomationElement.NameProperty, "Workspace", PropertyConditionFlags.IgnoreCase);
... 评估失败。为什么?
答案是如何评估您的条件。查看您的元素树,我们注意到 Workspace
的这个属性:
IsWindowPatternAvailable: false
对于主窗口和 Untitled3
:
IsWindowPatternAvailable: true
UIA_IsWindowPatternAvailablePropertyId 30044
Identifies the
IsWindowPatternAvailable
property, which indicates whether the Window control pattern is available for the automation element. IfTRUE
, a client can retrieve anIUIAutomationWindowPattern
interface from the element.
我们找到一个复制 in this thread ,这意味着与您当前遇到的故障模式相同。我们还注意到此元素缺少 Window
属性,因为 IUIAutomationWindowPattern
不可访问。
可从 aforelinked thread 获得解决方法.代替 PropertyCondition
,可以使用:
public class ConditionMatcher : IMatchConditions
{
public bool Matches(AutomationElement element, Condition condition)
{
return new TreeWalker(condition).Normalize(element) != null;
}
}
或者,或者,可以使用您提供的解决方法,前提是您的树结构保证是浅的(因此,适合该站点的名称,不会触发堆栈溢出)。
不可否认,这不是最明显的问题。在完美的世界中,MSDN 应该有关于这个主题的更好的文档。
关于c# - AutomationElement 使用 Inspect.exe 显示,但在使用 UIAutomationCore.dll 或 System.Windows.Automation 时不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282275/
我正在尝试创建一个工作流程,使用 Instapaper 将 URL 列表转换为纯文本,然后将文本保存在我机器上的文本文档中。 到目前为止,我已经能够获取 URL 列表、转换它们并保存文本文档。问题是我
有没有办法自动执行这些步骤? 打开 LibreOffice ODT 更新 TOC 和其他字段(例如通过菜单工具|更新|全部更新) 保存并关闭文档 最佳答案 如果您使用的是 Windows,那么使用 A
在 Microsoft Power Automate 中,使用表达式 utcNow() 可以获得当前日期(和时间)。我正在尝试获取昨天的日期。我尝试了 dateadd(utcNow(), -1) 和类
我使用 Power Automate Desktop 创建了一个桌面流程。但我无法安排或让它自动运行。有什么办法吗? 我不希望使用云流和使用网关连接桌面流。我需要在我的台式机本身内自动运行桌面流程。有
列表开始为空。然后,如果满足特定条件,我想为循环中的每次迭代附加一个值。我在变量操作中没有看到附加选项。 最佳答案 您可以使用字符串分割来实现此目的,假设您知道一个永远不会出现在值列表中的分隔符。我使
我使用 Power Automate Desktop 创建了一个桌面流程。但我无法安排或让它自动运行。有什么办法吗? 我不希望使用云流和使用网关连接桌面流。我需要在我的台式机本身内自动运行桌面流程。有
我使用的是 Mac OS X 11.0.1 Big Sur 我使用 Automator 创建了一个“看我做”的 QuickAction。我已经保存了它(似乎默认保存在 ~/Library/Servic
我的问题的历史: 我正在研究 UI automator (2.1.3) 和 Espresso 测试 + 在简单的 Mac Air (2014) 上使用 android studio (3.0.1)。之
有人要求我将 Sharepoint 上的 Excel 在线电子表格中的数据提取到 Power BI 中以创建仪表板 - 没问题,对吧?好吧,“数据点”之一实际上是指示状态的单元格的填充颜色。我进行了一
在 Power Automate 中,我正在调用一个返回此 JSON 的 API: { "status":"200", "Suburbs":[ { "
更新到 Mojave 后,我无法再使用之前使用的 automator 服务,并出现以下警报。 在“安全与隐私”中,我已经选中了 AppleScript Editor。 您发现我的代码有任何问题吗?或者
我在 Windows 7 下使用 Powershell 4,并且我的 cmdlet 定义如下: Function Transfer-File { [CmdletBinding()]
我在 commands.js 中使用这个方法 Cypress.Commands.add( 'iframeLoaded', { prevSubject: 'element' }, ($iframe) =
我正在使用 UI Automation 插件来自动化和测试在 Java 窗口中包含 HTML 对象的应用程序。我已将 UIATable 识别并保存在我的对象存储库中,并且以下方法工作正常: MsgBo
在我的项目中,有一个叫做创建任务的东西。创建任务并关闭页面后,系统会提示我一个警报“您即将关闭此应用程序并保存所有更改......” 然后是 OK 和 Cancel。 使用 F12,我无法检测到警报和
我使用 Cmder 作为我的命令提示符/控制台。 我发现自己每天多次使用相同的命令。例如 git merge --no-ff my-long-branch-name 有什么方法可以将这些命令存储在快捷
我是 Applescript 的新手,目前无法访问提示窗口,要求输入密码。 我正在为我的日常使用应用程序创建一个启动器,我想自动化启动过程。 现在,我只启动了两个应用程序,VirtualHostX 和
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this qu
如何为具有常规安装程序的程序创建自动安装程序,其中包含以下问题: 安装目录, 接受许可, 在桌面上创建图标 等等... 假设我可以为每个我想单独安装的程序构建一个自动安装程序,或者我想将文件放在一个自
如何在预定时间运行我的苹果脚本。我希望它每 45 分钟运行一次,但我不知道该怎么做。我将我的苹果脚本保存为应用程序。我接下来该怎么做? 谢谢 (目前,我正在使用 on idle 函数,但有更好的方法吗
我是一名优秀的程序员,十分优秀!