4

現在、私はこの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);
    }
}

Paint.NET などの比較的少数のコンポーネント (200 程度) を持つ一部のプログラムの場合、これには約 2 秒かかります。この機能を高速化したり、1 回の COM 呼び出しですべてのコンポーネントを取得したりする方法はありますか?

4

1 に答える 1

3

それはあなたがしようとしていることによって多少異なります。

特定のアイテムを探している場合は、ナビゲーション (accNavigate) を使用して、すべてのアイテムを調べるよりも速くアイテムに到達できる場合があります。

本当にすべてのアイテムを取得する必要がある場合は、バックグラウンド スレッドがうまく機能します。

もう 1 つのオプションは、UIAutomation API を使用することです。これは引き続きすべての IAccessible サーバーをサポートし、より豊富なキャッシュとフィルタリングが組み込まれています。IUIAutomationCacheRequest については MSDN を参照してください。詳細については、そのメソッドである TreeFilter および TreeScope を参照してください。特定のアイテムのケースにいる場合は、特定のアイテムを検索する方法もあります。

UIAutomation は IAccessible のスーパーセットと考えてください。UIAutomation は Vista SP2 以降で利用できます。

于 2012-06-22T16:53:31.710 に答える