在 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;
}
请帮忙!。