#c #winapi #microsoft-ui-automation
Вопрос:
Я пытаюсь получить информацию о текущем окне под курсором, у меня работает функция , когда я вручную указываю hwnd
, как я мог бы получить hwnd
информацию из текущего окна под мышью?
#include <UIAutomation.h>
POINT p;
GetCursorPos(amp;p);CComPtr<IAccessible> pAcc;
VARIANT varChild;
if (SUCCEEDED(AccessibleObjectFromWindow((HWND)hwnd,
OBJID_WINDOW,IID_IAccessible, reinterpret_cast<void**>(amp;pAcc))))
{
CComBSTR bstrName, bstrValue, bstrDescription;
varChild.vt = VT_I4;
varChild.lVal = CHILDID_SELF;
if (SUCCEEDED(pAcc->get_accName(varChild, amp;bstrName)))
auto name = bstrName.m_str;
if (SUCCEEDED(pAcc->get_accValue(varChild, amp;bstrValue)))
auto value = bstrValue.m_str;
if (SUCCEEDED(pAcc->get_accValue(varChild, amp;bstrDescription)))
auto description = bstrDescription.m_str;
}
Комментарии:
1.
WindowFromPoint()
,ChildWindowFromPoint()
,RealChildWindowFromPoint()
Ответ №1:
То, что вы ищете, — это метод IUIAutomation::elementFromPoint.
Вот небольшое консольное приложение (C с Visual Studio ATL), которое непрерывно отображает имя и дескриптор окна (если таковые имеются) элемента автоматизации под курсором:
// needs
//#include <UIAutomationCore.h>
//#include <UIAutomationClient.h>
int main()
{
if (SUCCEEDED(CoInitialize(NULL)))
{
CComPtr<IUIAutomation> automation;
if (SUCCEEDED(automation.CoCreateInstance(CLSID_CUIAutomation8))) // or CLSID_CUIAutomation
{
do
{
POINT pos;
if (GetCursorPos(amp;pos))
{
CComPtr<IUIAutomationElement> element;
if (SUCCEEDED(automation->ElementFromPoint(pos, amp;element)))
{
CComBSTR name;
element->get_CurrentName(amp;name);
wprintf(L"name: %sn", name);
UIA_HWND hwnd;
element->get_CurrentNativeWindowHandle(amp;hwnd);
wprintf(L"hwnd: %pn", hwnd);
}
}
Sleep(500);
} while (TRUE);
}
}
CoUninitialize();
return 0;
}
Комментарии:
1. Не могли бы вы рассказать мне, как выполнить действие по умолчанию для текущего элемента под курсором?
2. @Caio — Нет «действия по умолчанию», это зависит от того, что находится под курсором. Вы должны найти, какой «шаблон» реализован элементом docs.microsoft.com/en-us/windows/win32/winauto/… и используйте этот шаблон. Вы можете использовать средство проверки из пакета SDK Windows для проверки всех шаблонов. docs.microsoft.com/en-us/windows/win32/winauto/inspect-objects