Low Level Hook / SetWindowsHookEx lParam Auto-Repeat? - PullRequest
0 голосов
/ 02 июня 2019

Чтение здесь: Как реализовано автоматическое повторение клавиатуры на ПК с Windows?

Я понимаю, что низкоуровневая клавиатура не получает счетчик автоматического повторения: /

Обратите внимание, что низкоуровневый хук клавиатуры (WH_KEYBOARD_LL) не получает счетчик повторений.

Но почему ??oO

Способ, которым я использовал для извлечения счетчика автоповтора с помощью сообщений Windows:
int repeatCount = (lParam & KF_REPEAT);

Но по какой-то причине он не работает, когда я использую SetWindowsHookExперехват WH_KEYBOARD_LL.

Я хочу отфильтровать автоповтор для клавиши Space при использовании глобального перехвата.Есть ли способ сделать это?Возможно творческий способ определить, повторяется ли нажатие клавиши автоматически (т.е. удерживается)?

Пример кода:

    if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
    {
        KBDLLHOOKSTRUCT kbd = *(KBDLLHOOKSTRUCT *)(lParam);
        if (kbd.vkCode == VK_SPACE && !(lParam & KF_REPEAT))
        {
            // do something
        }
    }

1 Ответ

2 голосов
/ 02 июня 2019

Я понимаю, что низкоуровневая клавиатура не получает счетчик автоповтора ... Но почему ??

Поскольку счетчик автоповтора просто не существует на низком уровне. На этом уровне вы получаете события от самой клавиатуры. Ключ вниз, ключ вверх, вот и все. Клавиатура не управляет счетчиком.

На на более высоком уровне , когда система обрабатывает эти события низкого уровня с клавиатуры и генерирует ключевые сообщения для распространения в приложениях, система запускает собственный таймер для управления счетчиком повторов и создания соответствующего ключевые сообщения всякий раз, когда счетчик увеличивается.

Я хочу отфильтровать автоповтор для клавиши Space при использовании глобальной ловушки. Есть ли способ сделать это?

В низкоуровневом хуке вам придется запускать собственный таймер, как это делает система.

В противном случае используйте более высокий уровень перехват сообщений вместо клавиатуры.

...