MSAA UI Automation get_accChildCount 在 Winforms 中错误地为 Infragistics UltraTree 返回 0

MSAA UI Automation get_accChildCount Incorrectly Returning 0 for Infragistics UltraTree in Winforms

在 C# Winforms 应用程序中自动化 Infragistics UltraTree 控件时,我发现 UltraTree 实现了 AccessibleObject 模型 (MSAA)。通过将从 spy++ 获取的 hwnd 放入

,我能够成功获取 IAccessible 接口
IAccessible* accessibleObject;
AccessibleObjectFromWindow(hwnd, OBJID_CLIENT, IID_IAccessible, (void**)&accessibleObj);

问题是当我现在调用

long childCount;
accessibleObj->get_accChildCount(&childCount);

我得到的结果是零。通过查看 UltraTree 源代码,我注意到其 child 计数的实现不应返回零(通过使用 windbg 检查内部代码中使用的字段进行验证)。所有其他 MSAA 功能似乎都正常工作(例如 'accLocation')。

我很困惑为什么会这样。我也尝试过使用 'IEnumVARIANT',但同样没有发现 children,即使该树在 'get_accChildCount' 使用的集合中有 25 个项目。我还没有尝试查看 Microsoft Narrator 是否能够识别 children,因为该机器没有声卡,但希望尽快进行设置以进行尝试。我的猜测是旁白会找到 children 并且我缺少一些奇怪的技巧。

我在基础设施控制方面遇到了同样的问题。 如果您能够更改被测应用程序,您有 2 个选择,否则我认为没有解决方案并且您被困住了。


a) 覆盖您的 UltraTree 的 AutomationPeer 实现,因此只需创建您自己的 CustomizedUltraTree。这是关于此主题的有用 link Docu


b) 联系 infragistics 客户支持,对我来说这只是一些版本控制问题,他们非常快速和自信。

有点糟糕的答案,但我最终发现在 CLR 下 运行ning(打开 /clr)返回了正确的 children 数。完全相同的代码,唯一的区别是是否指定了 /clr 编译器开关。我真的不想 运行 CLR 下的这段代码,所以这对我来说不是一个理想的解决方案,但它在技术上确实回答了我的问题。

我将不得不 post 另一个问题,询问为什么会发生这种情况:(