long UiTreeWalk::UiTreeWalkerThreadProc()

in Tools/UIRecorder/UIXPathLib/UiTreeWalk.cpp [647:716]


long UiTreeWalk::UiTreeWalkerThreadProc(void* pVoidData)
{
    REQUIRE_SUCCESS_HR(CoInitializeEx(NULL, COINIT_MULTITHREADED));

    UiTreeWalk* pUiTreeWalk = new UiTreeWalk;

    HRESULT hr = pUiTreeWalk->InitAutomation();
    if (FAILED(hr))
    {
        CoUninitialize();
        REQUIRE_SUCCESS_HR(hr);
    }

    BOOL bRet;
    MSG msg;

    // Make sure the message queue is created
    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
    SetEvent(UiTreeWalk::s_hEventPathReady);

    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if (bRet == -1)
        {
            break;
        }

        switch (msg.message)
        {

        case WM_TIMER:
        {
            pUiTreeWalk->DrawHighlight();
            break;
        }
        case msgGetXPath:
        {
            pUiTreeWalk->InvalidateTargetRect();
            pUiTreeWalk->PathFromRootToTarget(HIWORD(msg.lParam), LOWORD(msg.lParam));
            SetEvent(UiTreeWalk::s_hEventPathReady);
            break;
        }
        case msgHighlight:
        {
            pUiTreeWalk->InvalidateTargetRect();
            pUiTreeWalk->FindCachedUI();
            SetEvent(UiTreeWalk::s_hEventPathReady);
            break;
        }
        case msgThreadTest:
        {
            SetEvent(UiTreeWalk::s_hEventPathReady);
            break;
        }
        default:
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            break;
        }
        }
    }

    pUiTreeWalk->InvalidateTargetRect();
    pUiTreeWalk->UnInitAutomation();
    delete pUiTreeWalk;

    CoUninitialize();
    return 0;
}