SetWinEventHook имеет EVENT_OBJECT_INVOKED, но событие не запускается при нажатии кнопки

avatar
grit639
8 августа 2021 в 17:57
142
0
-1

В Windows/Chrome я хочу отслеживать все элементы, с которыми взаимодействовал пользователь, например, на главной странице Google, имя/значение поля со списком поиска и имя кнопки, а также другие сведения о кнопке (в данном случае это «Поиск Google»), когда «Google Поиск». Я запускаю хром с:

chrome.exe --force-renderer-accessibility

Я направляю вывод в файл, но не получаю "Hello World" в файле, который является первым оператором WinEventProc, это означает, что обратный вызов никогда не запускается, даже когда я нажимаю кнопку поиска Google.

Ниже приведен код, представляющий собой модифицированную версию примера кода, взятого из Интернета

#include <Windows.h>
#include <Oleacc.h>
#include <Stdio.h>
#include <iostream>
#include <windows.h>
#include <ole2.h>
#include <uiautomation.h>
#include <strsafe.h>
#include <string>
#include <comdef.h>
#include <iostream>
#include <uiautomationclient.h>
#include <cstring>
HWINEVENTHOOK LHook;
#pragma comment( lib,"Oleacc.lib")

#define MAX_LOADSTRING 100

VOID CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook,
    DWORD event,
    HWND hwnd,
    LONG idObject,
    LONG idChild,
    DWORD dwEventThread,
    DWORD dwmsEventTime);

#define WM_UPDATECAREPOS    (WM_USER + 1234)

void Unhook() {
    if (LHook == 0) return;
    UnhookWinEvent(LHook);
    CoUninitialize();
}

void Hook() {
    std::cout << "in hook";
    Unhook();
    if (LHook != 0) return;
    CoInitialize(NULL);
    std::cout << "before hook";
    LHook = SetWinEventHook(EVENT_OBJECT_INVOKED, EVENT_OBJECT_INVOKED, NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);
//LHook = SetWinEventHook(EVENT_OBJECT_STATECHANGE, EVENT_OBJECT_STATECHANGE, NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);
//LHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_VALUECHANGE, 0, WinEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS);
}


int _cdecl wmain()
{
    Hook();
    while(true)
    {
    }
    Unhook();
    return 1;
}

VOID CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook,
    DWORD event,
    HWND hwnd,
    LONG idObject,
    LONG idChild,
    DWORD dwEventThread,
    DWORD dwmsEventTime)
{
    std::cout << "hello world";
    IAccessible* pAcc = NULL;
    IAccessible* pAcc2 = NULL;

    VARIANT varChild;
    VARIANT tmp;
    tmp.vt = VT_I4;
    tmp.lVal = CHILDID_SELF;
    BSTR bstrName2;

    HRESULT hr3 = AccessibleObjectFromWindow(hwnd, idObject, IID_IAccessible, (void **)&pAcc2);
    pAcc2->get_accName(tmp, &bstrName2);
    std::string invoked = _bstr_t(bstrName2, false);
    std::cout << "hello world" << invoked << std::endl;
    printf("%ls\n", bstrName2);

    HRESULT hr = AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild);
    if ((hr == S_OK) && (pAcc != NULL)) {
        BSTR bstrName, bstrValue;
        pAcc->get_accValue(varChild, &bstrValue);
        pAcc->get_accName(varChild, &bstrName);

        printf("URL change: %ls   %ls\n", bstrName, bstrValue);
        pAcc->Release();
        pAcc2->Release();
    }

    return;
}

Пожалуйста, помогите!.

Источник
Remy Lebeau
8 августа 2021 в 18:04
0

Веб-браузеры не используют стандартные элементы управления Win32 в пользовательском интерфейсе содержимого из соображений производительности. Таким образом, хуки WinEvent не будут работать на веб-страницах. Единственными способами взаимодействия с содержимым браузера являются UIAutomation (если поддерживается браузером) или специальные API-интерфейсы DOM для конкретного браузера.

grit639
8 августа 2021 в 18:10
0

@RemyLebeau: Но в коде, когда я раскомментирую строку: //LHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_VALUECHANGE, 0, WinEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS); Я могу получить подробную информацию из веб-контента, но он также дает подробную информацию об элементах, которые просто присутствуют, но пользователь не взаимодействовал с ними.

grit639
8 августа 2021 в 18:13
0

@RemyLebeau: мне нужны подробности только о тех элементах, с которыми взаимодействовал пользователь. Вот почему я пытаюсь использовать SetWinEventHook(EVENT_OBJECT_INVOKED, EVENT_OBJECT_INVOKED, NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT); ИЛИ SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_VALUECHANGE, 0, WinEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS);

Ответы (0)