0

在 windows/chrome 中,我想跟踪用户在 Google 主页上与之交互的所有元素,搜索组合框的名称/值和按钮名称以及其他按钮详细信息(在本例中为“Google 搜索”),当“Google 搜索”为点击。我确实开始使用 chrome:

chrome.exe --force-renderer-accessibility

我将输出定向到一个文件,但我没有在文件中得到“Hello World”,这是 WinEventProc 的第一条语句,这意味着即使我点击 Google Search 按钮也不会触发回调。

下面是从互联网上获取的一些示例代码的修改版本的代码

#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;
}

请帮忙!。

4

0 回答 0