Установите HWND под курсором для использования с UIAutomation

#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