[英]How to use SetWindowsHookEx to capture specific widget in Chrome?
我需要在Chrome中获取特定页面小部件的矩形,因此我使用了SetWindowsHookEx。 当我通过标题名称获取特定页面的hwnd,并获取其进程和线程ID,并使用SetWindowsHookEx捕获其rect并显示消息框并写入文件。 但令我困惑的是两件事。
当我真的有一个Widget名称为“谷歌 - 谷歌浏览器”时,Chrome中的所有小部件,当我移动所有小部件时,会显示一个消息框,我的文件已写入他们的矩形。
(小部件,我不知道如何清楚地描述它,一个小部件有很多页面,chrome有很多小部件,一个小部件是一个进程)
当我没有名为“Google - Google Chrome”的小部件时,pid和tid都为0,但是当我移动任何小部件时,会显示一个消息框并且我的文件已被写入。 正如msdn所示,如果tid为零,则所有64位程序都应该具有所有动作。
int main()
{
std::cout << "hi" << std::endl;
HMODULE hdll = LoadLibrary(L"Dll1.dll");
HOOKPROC hproc = (HOOKPROC)GetProcAddress(hdll, "CallWndRefProc");
int a = GetLastError();
std::cout <<"error: "<< a << std::endl;
HWND hwnd=FindWindow(NULL, L"ssss - Google Chrome");
DWORD pid = 0;
DWORD tid = GetWindowThreadProcessId(hwnd, &pid);
HHOOK hook = SetWindowsHookEx(WH_CBT, hproc, hdll, tid);
std::cout << "Hello World!\n";
//for (int i = 0; i < 800; i++) {
// Sleep(2000);
//}
UnhookWindowsHookEx(hook);
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK CallWndRefProc(__in int nCode, __in WPARAM wParam, __in LPARAM lParam)
{
if (NULL != lParam) {
if (nCode == HCBT_MOVESIZE) {
RECT *rect = (RECT *)lParam;
MessageBox(NULL, TEXT(""), TEXT("Tips"), MB_OK);
FILE *file;
fopen_s(&file, "F:\\hooklog.txt", "a+");
fprintf(file, "Move or size (%d, %d, %d, %d) for target window.\n", rect->left, rect->right, rect->top, rect->bottom);
fprintf(file, "lParam(%d)", wParam);
fclose(file);
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
现在我发现,在第一种情况下,我尝试在chrome中创建两个wdiget,但它的pid和tid都是相同的? 为什么? 如果他们的pid相同,为什么在我的任务管理器中有很多铬?
在第2种情况下,我发现我的IDE-VS2017没有动作,因为它是32位的。 但是FireFox和Chrome都有这种行动,所以它解释了这一点。
现在,Chrome中的所有小部件都有一个pid和tid吗? 他们都在一个过程中吗? 在这种情况下,我如何获得特定小部件的矩形?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.