C++ 使用IUIAutomation接口获取界面元素
#include <UIAutomation.h>
HUTIL_API void HIUIAutomationHelper::GetAllNone(HWND hwnd)
{
CComPtr<IUIAutomation> sp_utomation = NULL;
HRESULT hr = CoCreateInstance(CLSID_CUIAutomation, NULL, CLSCTX_INPROC_SERVER, IID_IUIAutomation, reinterpret_cast<void**>(&sp_utomation));
if (FAILED(hr) || sp_utomation == NULL)
{
return;
}
CComPtr < IUIAutomationElement> sp_hwnd_element = NULL;
hr = sp_utomation->ElementFromHandle(hwnd, &sp_hwnd_element);
if (FAILED(hr) || sp_hwnd_element == NULL)
{
return;
}
CComPtr < IUIAutomationCondition> sp_condition = NULL;
hr = sp_utomation->CreateTrueCondition(&sp_condition);
if (FAILED(hr) || sp_condition == NULL)
{
return;
}
CComPtr < IUIAutomationElementArray> sp_found = NULL;
hr = sp_hwnd_element->FindAll(TreeScope_Subtree, sp_condition, &sp_found);
if (FAILED(hr) || sp_found == NULL)
{
return;
}
int i_length;
hr = sp_found->get_Length(&i_length);
if (FAILED(hr))
{
return;
}
for (size_t i = 0; i < i_length; i++)
{
CComPtr < IUIAutomationElement> sp_node = NULL;
hr = sp_found->GetElement(i, &sp_node);
if (FAILED(hr))
{
continue;
}
RECT rect_retVal;
sp_node->get_CurrentBoundingRectangle(&rect_retVal);
if (rect_retVal.top == 0 && rect_retVal.bottom == 0)
{
continue;
}
CComBSTR retVal;
sp_node->get_CurrentName(&retVal);
CComBSTR retVal2;
sp_node->get_CurrentItemStatus(&retVal2);
CComBSTR retVal3;
sp_node->get_CurrentClassName(&retVal3);
UIA_HWND h_retVal;
sp_node->get_CurrentNativeWindowHandle(&h_retVal);
CComBSTR retVal4;
sp_node->get_CurrentItemType(&retVal4);
}
return ;
}