作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
现在我有这个 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 调用或类似的东西中获取所有组件?
最佳答案
这在某种程度上取决于您要做什么。
如果您要查找特定项目,有时可以使用导航 (accNavigate) 更快地找到项目,而不是浏览所有项目。
如果您确实需要获取所有项目,后台线程会很有效。
另一种选择是使用 UIAutomation api,它仍然支持所有 IAccessible 服务器,并且内置了更丰富的缓存和过滤功能。在 MSDN 上查找 IUIAutomationCacheRequest 及其方法 TreeFilter 和 TreeScope 以获取更多信息。如果您处于特定项目案例中,它还有一种搜索特定项目的方法。
将 UIAutomation 视为 IAccessible 的超集。 UIAutomation 在 Vista SP2 及更高版本上可用。
关于c++ - 有没有办法让 MSAA IAccessible 遍历更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103505/
我是一名优秀的程序员,十分优秀!