Windows 11, UIAutomation COM API IUIAutomationTreeWalker.GetFirstChildElement costs 60 seconds!!

%3CLINGO-SUB%20id%3D%22lingo-sub-3005421%22%20slang%3D%22zh-CN%22%3EWindows%2011%2C%20UIAutomation%20COM%20API%20IUIAutomationTreeWalker.GetFirstChildElement%20costs%2060%20seconds!!%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3005421%22%20slang%3D%22zh-CN%22%3E%3CP%3EThe%20following%20code%20runs%20well%20and%20very%20fast%20on%20Windows%207%2F8%2F10.%3C%2FP%3E%3CP%3EIt%20just%20gets%20the%20root%20element%20and%20root%20element's%20first%20child%20element%20by%26nbsp%3BUIAutomation%20COM%20API.%3C%2FP%3E%3CP%3EBut%20after%20updating%20to%20Windows%2011%2C%20the%20API%26nbsp%3BIUIAutomationTreeWalker.GetFirstChildElement%20blocks%20and%20costs%2060%20seconds!%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EIUIAutomationTreeWalker.GetFirstChildElement%20only%20costs%200%20ms%20on%20Windows%2010.%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-cpp%22%3E%3CCODE%3E%23include%20%3CIOSTREAM%3E%0A%23include%20%3CUIAUTOMATION.H%3E%0A%23include%20%3CLOCALE.H%3E%0A%0Aint%20main()%0A%7B%0A%20%20%20%20setlocale(LC_ALL%2C%20%22%22)%3B%0A%20%20%20%20CoInitialize(nullptr)%3B%0A%20%20%20%20IUIAutomation*%20pAutomation%20%3D%20nullptr%3B%0A%20%20%20%20IUIAutomationTreeWalker*%20pRawTreeWalker%20%3D%20nullptr%3B%0A%0A%20%20%20%20if%20(!pAutomation)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20HRESULT%20hr%20%3D%20CoCreateInstance(__uuidof(CUIAutomation)%2C%20nullptr%2C%20CLSCTX_INPROC_SERVER%2C%20__uuidof(IUIAutomation)%2C%20reinterpret_cast%3CVOID%3E(%26amp%3BpAutomation))%3B%0A%20%20%20%20%20%20%20%20printf(%22AutomationClient%3A%20CoCreateInstance%20CUIAutomation%20%25s.%5Cn%22%2C%20SUCCEEDED(hr)%20%3F%20%22succeed%22%20%3A%20%22failed%22)%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20(pAutomation)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20pAutomation-%26gt%3Bget_RawViewWalker(%26amp%3BpRawTreeWalker)%3B%0A%20%20%20%20%20%20%20%20IUIAutomationElement*%20root%20%3D%20nullptr%3B%0A%20%20%20%20%20%20%20%20HRESULT%20hr%20%3D%20pAutomation-%26gt%3BGetRootElement(%26amp%3Broot)%3B%0A%20%20%20%20%20%20%20%20BSTR%20name%2C%20className%3B%0A%20%20%20%20%20%20%20%20hr%20%3D%20root-%26gt%3Bget_CurrentName(%26amp%3Bname)%3B%0A%20%20%20%20%20%20%20%20hr%20%3D%20root-%26gt%3Bget_CurrentClassName(%26amp%3BclassName)%3B%0A%20%20%20%20%20%20%20%20wprintf(L%22root%20element%3A%20%25s%20%25s%5Cn%22%2C%20className%2C%20name)%3B%0A%20%20%20%20%20%20%20%20SysFreeString(name)%3B%0A%20%20%20%20%20%20%20%20SysFreeString(className)%3B%0A%0A%20%20%20%20%20%20%20%20DWORD%20startTick%20%3D%20GetTickCount()%3B%0A%20%20%20%20%20%20%20%20IUIAutomationElement*%20child%20%3D%20nullptr%3B%0A%20%20%20%20%20%20%20%20hr%20%3D%20pRawTreeWalker-%26gt%3BGetFirstChildElement(root%2C%20%26amp%3Bchild)%3B%0A%20%20%20%20%20%20%20%20DWORD%20cost%20%3D%20GetTickCount()%20-%20startTick%3B%0A%20%20%20%20%20%20%20%20hr%20%3D%20root-%26gt%3Bget_CurrentName(%26amp%3Bname)%3B%0A%20%20%20%20%20%20%20%20hr%20%3D%20root-%26gt%3Bget_CurrentClassName(%26amp%3BclassName)%3B%0A%20%20%20%20%20%20%20%20wprintf(L%22get%20root%20element%20first%20child%2C%20cost%20%25u%20ms%2C%20child%3A%20%25s%20%25s%5Cn%22%2C%20cost%2C%20className%2C%20name)%3B%0A%20%20%20%20%20%20%20%20SysFreeString(name)%3B%0A%20%20%20%20%20%20%20%20SysFreeString(className)%3B%0A%0A%20%20%20%20%20%20%20%20root-%26gt%3BRelease()%3B%0A%20%20%20%20%20%20%20%20root%20%3D%20nullptr%3B%0A%20%20%20%20%20%20%20%20child-%26gt%3BRelease()%3B%0A%20%20%20%20%20%20%20%20child%20%3D%20nullptr%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20(pRawTreeWalker)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20pRawTreeWalker-%26gt%3BRelease()%3B%0A%20%20%20%20%20%20%20%20pRawTreeWalker%20%3D%20nullptr%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20(pAutomation)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20pAutomation-%26gt%3BRelease()%3B%0A%20%20%20%20%20%20%20%20pAutomation%20%3D%20nullptr%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20CoUninitialize()%3B%0A%20%20%20%20std%3A%3Acout%20%26lt%3B%26lt%3B%20%22EXIT!%5Cn%22%3B%0A%7D%3C%2FVOID%3E%3C%2FLOCALE.H%3E%3C%2FUIAUTOMATION.H%3E%3C%2FIOSTREAM%3E%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22yinkaisheng_0-1637840632579.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F329442iA0CEDAB7267FA069%2Fimage-size%2Fmedium%3Fv%3Dv2%26amp%3Bpx%3D400%22%20role%3D%22button%22%20title%3D%22yinkaisheng_0-1637840632579.png%22%20alt%3D%22yinkaisheng_0-1637840632579.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3Ethe%20result%20on%20Windows%2010%3A%3C%2FP%3E%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22yinkaisheng_1-1637840772487.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F329443i1EA85DD4F8739481%2Fimage-size%2Fmedium%3Fv%3Dv2%26amp%3Bpx%3D400%22%20role%3D%22button%22%20title%3D%22yinkaisheng_1-1637840772487.png%22%20alt%3D%22yinkaisheng_1-1637840772487.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%3CP%3Ethe%20result%20on%20Windows%2011%3A%3C%2FP%3E%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22yinkaisheng_2-1637840895004.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F329444i465FE9DC9287BBE9%2Fimage-size%2Fmedium%3Fv%3Dv2%26amp%3Bpx%3D400%22%20role%3D%22button%22%20title%3D%22yinkaisheng_2-1637840895004.png%22%20alt%3D%22yinkaisheng_2-1637840895004.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E
Occasional Visitor

The following code runs well and very fast on Windows 7/8/10.

It just gets the root element and root element's first child element by UIAutomation COM API.

But after updating to Windows 11, the API IUIAutomationTreeWalker.GetFirstChildElement blocks and costs 60 seconds!

 

IUIAutomationTreeWalker.GetFirstChildElement only costs 0 ms on Windows 10.

#include <iostream>
#include <UIAutomation.h>
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "");
    CoInitialize(nullptr);
    IUIAutomation* pAutomation = nullptr;
    IUIAutomationTreeWalker* pRawTreeWalker = nullptr;

    if (!pAutomation)
    {
        HRESULT hr = CoCreateInstance(__uuidof(CUIAutomation), nullptr, CLSCTX_INPROC_SERVER, __uuidof(IUIAutomation), reinterpret_cast<void**>(&pAutomation));
        printf("AutomationClient: CoCreateInstance CUIAutomation %s.\n", SUCCEEDED(hr) ? "succeed" : "failed");
    }
    if (pAutomation)
    {
        pAutomation->get_RawViewWalker(&pRawTreeWalker);
        IUIAutomationElement* root = nullptr;
        HRESULT hr = pAutomation->GetRootElement(&root);
        BSTR name, className;
        hr = root->get_CurrentName(&name);
        hr = root->get_CurrentClassName(&className);
        wprintf(L"root element: %s %s\n", className, name);
        SysFreeString(name);
        SysFreeString(className);

        DWORD startTick = GetTickCount();
        IUIAutomationElement* child = nullptr;
        hr = pRawTreeWalker->GetFirstChildElement(root, &child);
        DWORD cost = GetTickCount() - startTick;
        hr = root->get_CurrentName(&name);
        hr = root->get_CurrentClassName(&className);
        wprintf(L"get root element first child, cost %u ms, child: %s %s\n", cost, className, name);
        SysFreeString(name);
        SysFreeString(className);

        root->Release();
        root = nullptr;
        child->Release();
        child = nullptr;
    }

    if (pRawTreeWalker)
    {
        pRawTreeWalker->Release();
        pRawTreeWalker = nullptr;
    }

    if (pAutomation)
    {
        pAutomation->Release();
        pAutomation = nullptr;
    }

    CoUninitialize();
    std::cout << "EXIT!\n";
}

 

yinkaisheng_0-1637840632579.png

 

the result on Windows 10:

yinkaisheng_1-1637840772487.png

the result on Windows 11:

yinkaisheng_2-1637840895004.png

 

 

0 Replies