使用 System.WindowsAutomation 库时无法检索控件的模式

Cannot retrieve the pattern for a control when using the System.WindowsAutomation library

我正在尝试使用 System.Windows.Automation 自动化 WinForms 应用程序,我能够检索元素(选项卡项)

var tab = window.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Tab));

但无法获得 select 的模式 (SelectionItemPattern)。这是模式列表及其对该元素的可用性(即 none):

Patterns for ControlType.TabItem: Is DockPatternIdentifiers.Pattern available: no Is ExpandCollapsePatternIdentifiers.Pattern available: no Is GridItemPatternIdentifiers.Pattern available: no Is GridPatternIdentifiers.Pattern available: no Is InvokePatternIdentifiers.Pattern available: no Is ItemContainerPatternIdentifiers.Pattern available: no Is MultipleViewPatternIdentifiers.Pattern available: no Is RangeValuePatternIdentifiers.Pattern available: no Is ScrollItemPatternIdentifiers.Pattern available: no Is ScrollPatternIdentifiers.Pattern available: no Is SelectionItemPatternIdentifiers.Pattern available: no <------------ Is SelectionPatternIdentifiers.Pattern available: no Is SynchronizedInputPatternIdentifiers.Pattern available: no Is TableItemPatternIdentifiers.Pattern available: no Is TablePatternIdentifiers.Pattern available: no Is TextPatternIdentifiers.Pattern available: no Is TogglePatternIdentifiers.Pattern available: no Is TransformPatternIdentifiers.Pattern available: no Is ValuePatternIdentifiers.Pattern available: no Is VirtualizedItemPatternIdentifiers.Pattern available: no Is WindowPatternIdentifiers.Pattern available: no

当我使用 inspect.exeVisualUIAVerifyNative.exe 检查应用程序时,我可以看到该模式存在并且可用,来自 inspect.exe:

的输出

IsAnnotationPatternAvailable: false IsDragPatternAvailable: false IsDockPatternAvailable: false IsDropTargetPatternAvailable: false IsExpandCollapsePatternAvailable: false IsGridItemPatternAvailable: false IsGridPatternAvailable: false IsInvokePatternAvailable: false IsItemContainerPatternAvailable: false IsLegacyIAccessiblePatternAvailable: true IsMultipleViewPatternAvailable: false IsObjectModelPatternAvailable: false IsRangeValuePatternAvailable: false IsScrollItemPatternAvailable: false IsScrollPatternAvailable: false IsSelectionItemPatternAvailable: true <--------------------------------- IsSelectionPatternAvailable: false IsSpreadsheetItemPatternAvailable: false IsSpreadsheetPatternAvailable: false IsStylesPatternAvailable: false IsSynchronizedInputPatternAvailable: false IsTableItemPatternAvailable: false IsTablePatternAvailable: false IsTextChildPatternAvailable: false IsTextEditPatternAvailable: false IsTextPatternAvailable: false IsTextPattern2Available: false IsTogglePatternAvailable: false IsTransformPatternAvailable: false IsTransform2PatternAvailable: false IsValuePatternAvailable: false IsVirtualizedItemPatternAvailable: false IsWindowPatternAvailable: false

它适用于使用纯 WinForms 控件构建的小型应用程序。在这种情况下,该应用程序是使用 3rd 方组件构建的。我的结论是在这些控件中实现自动化的方式存在问题。

那么模式真的可用吗? inspect.exe 是否通过不同的 API 获得使用权?

我可以 运行 VisualUIAVerifyNative 中的可访问性测试(即 Pattern Tests > Priority 3 Tests > Select.1.4 测试)到 select 选项卡.或者我可以 select 通过在 属性 网格中执行命令 (Patterns > SelectionItemPattern > Select).

看来我的 C# 代码中遗漏了一些重要的东西。

有人可以帮忙吗?谢谢!

我找到了解决方案 - 我现在引用 Interop.UIAutomationClient.dll 而不是引用 System.Windows.Automation.dll。此 DLL 是 UIAutomationVerify 分发的一部分,或者可以使用 TlbImp.exe(参见 How to build a interop dll from the UIAutomationClient.dll)生成。