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;
}