【问题标题】:MSAA UI Automation get_accChildCount Incorrectly Returning 0 for Infragistics UltraTree in WinformsMSAA UI 自动化 get_accChildCount 为 Winforms 中的 Infragistics UltraTree 错误地返回 0
【发布时间】:2015-12-06 20:59:33
【问题描述】:

在 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 源代码,我注意到它的子计数实现不应返回零(通过使用 windbg 检查内部代码中使用的字段进行验证)。所有其他 MSAA 功能似乎都正常工作(例如“accLocation”)。

我很困惑为什么会这样。我也尝试过使用“IEnumVARIANT”,但是即使树在“get_accChildCount”使用的集合中有 25 个项目,同样也没有发现任何子项。由于机器没有声卡,我还没有尝试查看 Microsoft Narrator 是否能够识别孩子,但希望尽快进行设置尝试。我的猜测是讲述人会找到孩子们,我错过了一些奇怪的技巧。

【问题讨论】:

标签: c++ winforms infragistics microsoft-ui-automation msaa


【解决方案1】:

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


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


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

【讨论】:

  • 我无法更改正在测试的应用程序。如果可以的话,我会更新代码并使用 UI 自动化而不是 MSAA,这应该可以工作。源代码中的自动化实现是 MSAA。我查看了 UI 自动化到 MSAA 的桥梁,但不幸的是,它似乎没有提供我正在寻找的功能。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2011-03-12
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多