IUIAutomationElement* find_ui_child(IUIAutomationElement *pElement) { HRESULT hr; IUIAutomationElement* tmp = NULL; IUIAutomationCondition* pCondition = NULL; IUIAutomationElementArray* pFoundArray = NULL; IUIAutomationElement* pFound = NULL; VARIANT var; do { int c = 0; var.vt = VT_I4; var.lVal = UIA_ToolBarControlTypeId; hr = g_uia->CreatePropertyCondition(UIA_ControlTypePropertyId,var, &pCondition); if (FAILED(hr)) { break; } hr = pElement->FindAll(TreeScope_Children,pCondition, &pFoundArray); if (FAILED(hr)) { break; } hr = pFoundArray->get_Length(&c); if (FAILED(hr)) { break; } for (int idx = 0; idx < c; idx++) { hr = pFoundArray->GetElement(idx, &tmp); if (FAILED(hr)) { break; } if ((pFound = find_next_child(tmp)) != NULL) { break; } } }while (0); if (pCondition) { pCondition->Release(); } if (tmp) { tmp->Release(); } if (pFoundArray) { pFoundArray->Release(); } return pFound; }
Element* Client::getRootElement() { IUIAutomationElement* root = NULL; HRESULT hr = UIA->GetRootElement(&root); if ( FAILED(hr) || !root ) { emit eventHappened( tr("Cannot obtain the Desktop element"), Log::WARNING ); if (root) root->Release(); return NULL; } return ElementFactory::getElement(root); }
IUIAutomationElement* get_tab_bars(HWND hwnd) { HRESULT hr = 0; IUIAutomationElement* pFound = NULL; IUIAutomationElement* root = NULL; if (g_uia == NULL || hwnd == NULL) { return NULL; } hr = g_uia->ElementFromHandle(hwnd, &root); if (SUCCEEDED(hr)) { pFound = find_ui_child(root); } if (root) { root->Release(); } return pFound; }
/* 得到标签页的事件指针, 当标签已激活时把active参数设为1 */ bool mouse_on_tab(RECT *pr, POINT *pt, int *active) { HRESULT hr; IUIAutomationCondition* pCondition = NULL; IUIAutomationElementArray* pFoundArray = NULL; IUIAutomationElement* tmp = NULL; IUIAutomationElement* tab_bar = NULL; VARIANT var; bool res = false; if ((tab_bar = get_tab_bars(WindowFromPoint(*pt))) == NULL) { #ifdef _LOGDEBUG logmsg("tab_bar is null from mouse_on_tab, res return false!\n"); #endif return res; } do { int c = 0; var.vt = VT_I4; var.lVal = UIA_TabItemControlTypeId; hr = g_uia->CreatePropertyCondition(UIA_ControlTypePropertyId,var, &pCondition); if (FAILED(hr)) { #ifdef _LOGDEBUG logmsg("CreatePropertyCondition false!\n"); #endif break; } hr = tab_bar->FindAll(TreeScope_Children,pCondition, &pFoundArray); if (FAILED(hr)) { #ifdef _LOGDEBUG logmsg("FindAll false!\n"); #endif break; } hr = pFoundArray->get_Length(&c); if (FAILED(hr)) { break; } for (int idx = 0; idx < c; idx++) { hr = pFoundArray->GetElement(idx, &tmp); if (FAILED(hr)) { break; } hr = tmp->get_CurrentBoundingRectangle(pr); if (SUCCEEDED(hr) && PtInRect(pr, *pt)) { if (active != NULL) { tmp->get_CurrentIsKeyboardFocusable(active); } res = true; break; } } }while (0); if (pCondition) { pCondition->Release(); } if (tmp) { tmp->Release(); } if (pFoundArray) { pFoundArray->Release(); } if (tab_bar) { tab_bar->Release(); } return res; }
DWORD WINAPI AccessUIThreadFunction( LPVOID lpParam ) { try { HRESULT hr; CoInitializeEx(NULL,COINIT_MULTITHREADED); PParamData data = (PParamData)lpParam; //WPARAM wParam = data->wParam; //LPARAM lParam = data->lParam; //time_t timer = data->timer; SYSTEMTIME sys = data->sys; //string processName = data->processName; //string windowName = data->windowName; POINT point = data->pt; string strTime = GetSysLocalTimeStr(sys); //EnterCriticalSection(&_critical); /* IUIAutomationCacheRequest* cacheRequest; g_pAutomation->CreateCacheRequest(&cacheRequest); cacheRequest->AddPattern(UIA_ValuePatternId); cacheRequest->AddProperty(UIA_LocalizedControlTypePropertyId); cacheRequest->AddProperty(UIA_RuntimeIdPropertyId); cacheRequest->AddProperty(UIA_NamePropertyId); cacheRequest->AddProperty(UIA_BoundingRectanglePropertyId); */ IUIAutomationElement* element = NULL; //hr = g_pAutomation->ElementFromPointBuildCache(point,cacheRequest,&element); hr = g_pAutomation->ElementFromPoint(point, &element); //printf_s("bad_alloc 3\n"); if(element == NULL || S_OK != hr) { printf_s("Cann't get Element\n"); //if(cacheRequest != NULL) //{ // cacheRequest->Release(); //} if(element != NULL) { element->Release(); } CoUninitialize(); //LeaveCriticalSection(& _critical); return 1; } std::string elementDesc = GetElementDescStr(element); std::string elementName = GetElementNameStr(element); std::string elementValue = GetElementValueStr(element); string pname, ptype; GetElementParentNameWStr(g_pControlWalker,element, pname, ptype); ReplaceAll(elementValue,"\n","\\n"); ReplaceAll(elementValue,"\t","\\t"); //TODO: Parent name when name is empty, but not success SAFEARRAY* rumtimeId; element->GetRuntimeId(&rumtimeId); RECT bounding; //element->get_CachedBoundingRectangle(&bounding); element->get_CurrentBoundingRectangle(&bounding); std::string runtimeId = GetRuntimeIDStr(rumtimeId); //printf_s("bad_alloc 4\n"); //LeaveCriticalSection(& _critical); //fwprintf_s(fMouseLog,_T("%s %d\n"), timestamp.c_str(), timer); //fwprintf_s(fMouseLog, _T("UIAutomation: %s, %s\n\n"),elementDesc.c_str(),elementName.c_str()); FILE* file; std::string filename = "log/detail/" + strTime + ".txt"; std::wstring temp(filename.length(), L'#'); mbstowcs(&temp[0],filename.c_str(),filename.length()); _tfopen_s(&file,temp.c_str(),_T("w")); temp.clear(); fprintf_s(file, "%s %d\n", strTime.c_str()); //timestamp fprintf_s(file, "%s\n", runtimeId.c_str()); //runtime id //fprintf_s(file, "Window: %s\n", windowName.c_str()); fprintf_s(file, "%s\n", elementDesc.c_str()); //control type fprintf_s(file, "%s\n", elementName.c_str()); //contorl name fprintf_s(file, "%d %d %d %d\n", bounding.left, bounding.top, bounding.right, bounding.bottom); //bounding fprintf_s(file, "%s\n", pname.c_str()); //parent name fprintf_s(file, "%s\n", ptype.c_str()); //parent type fprintf_s(file, "%s", elementValue.c_str()); //control value fclose(file); //if(cacheRequest != NULL) //{ // cacheRequest->Release(); //} if(element != NULL) { element->Release(); } SafeArrayDestroy(rumtimeId); CoUninitialize(); } catch(std::exception &e) { printf_s("exception: %s\n", e.what()); } return 0; }