SetWindowsHookEx - разница между VK_LSHIFT и кнопкой «Поиск» на клавиатуре - PullRequest
0 голосов
/ 18 января 2020

Я использую SetWindowsHookEx для перехвата событий клавиатуры

SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)

Вот HookCallback

LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
        // the action is valid: HC_ACTION.
        if (wParam == WM_KEYDOWN)
        {
            kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
            printf("%ld\n", kbdStruct.vkCode);
        }
    }
}

Когда нажимается "сдвиг влево", вывод

160

при нажатии Вывод кнопки «Поиск» (кнопка со значком лупы на ноутбуках):

160
91
132

Как проверить, нажата ли кнопка «сдвиг влево» или «поиск» внутри HookCallback?

1 Ответ

2 голосов
/ 18 января 2020

160 - VK_LSHIFT, 91 - VK_LWIN, а 132 - VK_F21. См. Коды виртуальных клавиш . Единственная стандартизированная клавиша поиска - VK_BROWSER_SEARCH, поэтому, очевидно, ваш производитель клавиатуры использует нестандартную клавишу для своей клавиши поиска.

При необходимости вы должны помнить клавиши, которые вы видите от одного события к другому, например:

bool LeftShiftIsDown = false;
bool LeftWinIsDown = false;
bool F21IsDown = false;
bool SearchIsDown = false;

LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        KBDLLHOOKSTRUCT *kbdStruct = (KBDLLHOOKSTRUCT*) lParam;
        if (wParam == WM_KEYDOWN)
        {
            printf("%ld is down\n", kbdStruct->vkCode);
            switch (kbdStruct->vkCode)
            {
                case VK_LSHIFT:
                    LeftShiftIsDown = true;
                    break;
            case VK_LWIN:
                    LeftWinIsDown = true;
                    break;
            case VK_F21:
                    F21IsDown = true;
                    break;
            }

            if (LeftShiftIsDown && LeftWinIsDown && F21IsDown)
            {
                if (!SearchIsDown)
                {
                    SearchIsDown = true;
                    printf("Search is down\n");
                }
            }
        }
        else if (wParam == WM_KEYUP)
        {
            printf("%ld is up\n", kbdStruct->vkCode);
            switch (kbdStruct->vkCode)
            {
                case VK_LSHIFT:
                    LeftShiftIsDown = false;
                    break;
                case VK_LWIN:
                    LeftWinIsDown = false;
                    break;
                case VK_F21:
                    F21IsDown = false;
                    break;
            }

            if (!(LeftShiftIsDown && LeftWinIsDown && F21IsDown))
            {
                if (SearchIsDown)
                {
                    SearchIsDown = false;
                    printf("Search is up\n");
                }
            }
        }
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...