繁体   English   中英

如何使用SetWindowsHookEx捕获Chrome中的特定小部件?

[英]How to use SetWindowsHookEx to capture specific widget in Chrome?

我需要在Chrome中获取特定页面小部件的矩形,因此我使用了SetWindowsHookEx。 当我通过标题名称获取特定页面的hwnd,并获取其进程和线程ID,并使用SetWindowsHookEx捕获其rect并显示消息框并写入文件。 但令我困惑的是两件事。

  1. 当我真的有一个Widget名称为“谷歌 - 谷歌浏览器”时,Chrome中的所有小部件,当我移动所有小部件时,会显示一个消息框,我的文件已写入他们的矩形。

    (小部件,我不知道如何清楚地描述它,一个小部件有很多页面,chrome有很多小部件,一个小部件是一个进程)

  2. 当我没有名为“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM