Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
/* 得到标签页的事件指针, 当标签已激活时把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;
}
Exemplo n.º 5
0
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; 
}