Перехват событий клавиатуры и мыши в одном хуке

Создаю библиотеку для операционной системы Windows, которая должна будет получать сообщения мыши и клавиатуры от определенного потока. Не могу определиться с тем, какой тип хука больше всего подходит под эту задачу. Сначала думал на WH_CALLWNDPROC, но, как оказалось, он не получает сообщения клавиатуры. Потом выбор пал на WH_GETMESSAGE. Я проверил, он получает как сообщения мыши так и сообщения клавиатуры, однако, определить какая клавиша клавиатуры была нажата я так и не смог. При нажатии левого и правого шифта, если смотреть на структуру MSG в wParam, выводит одну и ту же цифру.

LRESULT CALLBACK messageHandler(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
    {
        return CallNextHookEx(hookHandle, nCode, wParam, lParam);
    }
    
    MSG* pMSG = reinterpret_cast<MSG*>(lParam);

    switch (pMSG->message)
    {
        case WM_KEYUP:
        {
            cout << pMSG->wParam << endl;
        }

        break;
    }

    return CallNextHookEx(hookHandle, nCode, wParam, lParam);
}

DWORD WINAPI messageDispatcher(LPVOID thread)
{
    hookHandle = SetWindowsHookEx(WH_GETMESSAGE, messageHandler, GetModuleHandle(nullptr), *reinterpret_cast<DWORD*>(thread));

    if (!hookHandle)
    {
        return GetLastError();
    }

    MSG message{};

    while (GetMessage(&message, 0, 0, 0) > 0)
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    return 0;
}

Собственно вопроса всего два:

  1. Какой хук больше всего подходит для отлова событий как клавиатуры так и мыши?
  2. Как в текущем коде определить что был нажат именно VK_RSHIFT?

Ответы (0 шт):