2012-06-19 74 views
4

現在我有此C++函數(除去安全檢查和一些代碼,使其更具有可讀性):有沒有辦法讓MSAA IAccessible遍歷更快?

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調用中獲取所有組件?或者類似的東西?

回答

3

這取決於你在做什麼。

如果您正在查找特定物品,有時可以使用導航(accNavigate)更快地查看物品,而不是查看所有物品。

如果您確實需要獲取所有的項目,後臺線程效果很好。

另一種選擇是使用UIAutomation API,它仍然支持所有IAccessible服務器,並且內置了更豐富的緩存和過濾功能。查看MSDN中的IUIAutomationCacheRequest,以及它的方法TreeFilter和TreeScope以獲取更多信息。如果您處於特定項目的情況下,它還可以搜索特定項目。

將UIAutomation想象爲IAccessible的超集。 UIAutomation可用於Vista SP2及更高版本。

+0

使用UIAutomation不是一個不幸的選擇(需要爲XP Service Pack 2工作),和accNavigate似乎沒有比我現在得到孩子的方式(它也被棄用)更快。儘管感謝您的回覆。後臺線程將如何提高執行速度?他們不會讓事情變慢嗎? –

+0

後臺線程技術不會使得獲取項目的整個過程更快,但有時它可以用來使UI更加快速響應,從而使事情看起來比實際更快。 –

+0

[documentation](http://msdn.microsoft.com/en-us/library/windows/desktop/dd318473(v = vs.85).aspx)指出'accNavigate方法已被棄用,不應使用'。 –

相關問題