Как использовать SetWindowsHookEx для захвата конкретного виджета в Chrome? - PullRequest
0 голосов
/ 13 апреля 2019

Мне нужно получить прямоугольник определенного виджета страницы в Chrome, поэтому я использовал SetWindowsHookEx. И когда я получаю hwnd конкретной страницы через название заголовка, получаю идентификатор процесса и потока и использую SetWindowsHookEx, чтобы захватить ее прямоугольник, показать окно сообщения и записать в файл. Но что меня смущает, так это две вещи.

  1. Когда у меня действительно есть имя виджета как «Google - Google 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);
}

Теперь я обнаружил, что в первом случае я пытаюсь создать два wdiget в chrome, но его pid и tid одинаковы? Зачем? Если их pid одинаковы, почему в моем диспетчере задач много хрома?

И в случае 2 я обнаружил, что мой IDE-VS2017 не выполняет никаких действий, потому что он 32-разрядный. Но FireFox и Chrome все имеют такое действие, так что это объясняет это.

Теперь все ли виджеты в Chrome имеют один pid и tid? они все в одном процессе? В таком случае, как я могу получить прямоугольник определенного виджета?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...