【问题标题】:Is there a way to make MSAA IAccessible traversal faster?有没有办法让 MSAA IAccessible 遍历更快?
【发布时间】:2012-06-23 00:53:31
【问题描述】:

现在我有这个 C++ 函数(删除了安全检查和一些代码以使其更具可读性):

HRESULT WalkTreeWithAccessibleChildren(wstringstream *ss, IAccessible* pAcc, int depth)
{
    long childCount;
    long returnCount;   

    VARIANT* pArray = new VARIANT[childCount];
    hr = AccessibleChildren(pAcc, 0L, childCount, pArray, &returnCount);
    for (int x = 0; x < returnCount; x++) {
        VARIANT vtChild = pArray[x];
        Get the role and name of the component here
        // If it's an accessible object, get the IAccessible, and recurse.
        if (vtChild.vt == VT_DISPATCH) {
            IDispatch* pDisp = vtChild.pdispVal;
            IAccessible* pChild = NULL;
            hr = pDisp->QueryInterface(IID_IAccessible, (void**) &pChild);
            WalkTreeWithAccessibleChildren(ss, pChild, depth + 1);
    }
}

对于一些组件相对较少(200 个左右)的程序,例如Paint.NET,这大约需要 2 秒,有没有办法让这个函数更快,在一个 COM 调用中获取所有组件或类似的东西?

【问题讨论】:

    标签: c++ winapi accessibility msdn


    【解决方案1】:

    这在某种程度上取决于您要做什么。

    如果您正在寻找特定项目,有时可以使用导航(accNavigate)更快地找到项目,而不是浏览所有项目。

    如果您确实需要获取所有项目,后台线程可以很好地工作。

    另一个选择是使用 UIAutomation api,它仍然支持所有 IAccessible 服务器,并且内置了更丰富的缓存和过滤。在 MSDN 上查找 IUIAutomationCacheRequest 及其方法 TreeFilter 和 TreeScope 以获取更多信息。如果您处于特定项目案例中,它还可以搜索特定项目。

    将 UIAutomation 视为 IAccessible 的超集。 UIAutomation 在 Vista SP2 及更高版本上可用。

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 2017-03-26
      • 1970-01-01
      • 2019-08-03
      • 2018-12-12
      • 2010-11-20
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多