winapi - FindWindow против HCBT_CREATEWND - PullRequest
0 голосов
/ 11 апреля 2020

Мне нужно найти HWND для контекстного меню. Я создаю контекстное меню, как в этом учебнике, но без подменю. Я могу использовать функцию FindWindow следующим образом:

HWND hWndMenu = FindWindow(TEXT("#32768"), NULL);

Я также могу использовать хук WH_CBT. Вот процедура ловушки:

LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
    if (code == HCBT_CREATEWND)
    {
        HWND hwnd = (HWND)wParam;
        WCHAR name[1024] = { 0 };
        GetClassName(hwnd, name, sizeof(name));

        if (wcscmp(name, L"#32768"))
        {
            HWND hwndMenu = FindWindow(TEXT("#32768"), NULL);
            std::cout << "HCBT_CREATEWND hwnd: " << hwnd << std::endl;
            std::cout << "FindWindow hwnd: " << hwndMenu << std::endl;
        }
    }

    return code < 0 ? CallNextHookEx(myHook, code, wParam, lParam) : 0;
} 

Когда я открываю контекстное меню, я получаю два разных hwnd. Я не понимаю почему. Не могли бы вы объяснить это?

1 Ответ

1 голос
/ 11 апреля 2020

Во время вызова ловушки WH_CBT окно меню все еще находится в процессе создания, но еще не доступно для FindWindow (). Таким образом, вы в конечном итоге находите другое не связанное окно меню, которое существует в другом месте. Вот почему вы видите разные HWND.

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