Поделиться через


Функция LowLevelKeyboardProc

Описание

Определяемая приложением или библиотекой функция обратного вызова, используемая с функцией SetWindowsHookExA/SetWindowsHookExW . Система вызывает эту функцию каждый раз, когда новое событие ввода с клавиатуры будет помещено в очередь ввода потока.

Примечание

Когда эта функция обратного вызова вызывается в ответ на изменение состояния ключа, функция обратного вызова вызывается до обновления асинхронного состояния ключа. Следовательно, асинхронное состояние ключа невозможно определить путем вызова GetAsyncKeyState из функции обратного вызова.

Тип HOOKPROC определяет указатель на эту функцию обратного вызова. LowLevelKeyboardProc — это заполнитель для имени функции, определяемой приложением или библиотекой.

LRESULT CALLBACK LowLevelKeyboardProc(
  _In_ int    nCode,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);

Параметры

code [in]

Тип: int

Код, который используется в процедуре перехватчика для определения способа обработки сообщения.

Если значение nCode меньше нуля, процедура перехватчика должна передать сообщение функции CallNextHookEx без дальнейшей обработки и возвращать значение, возвращаемое CallNextHookEx.

Этот параметр может принимать одно из указанных ниже значений.

Значение Значение
HC_ACTION 0 Параметры wParam и lParam содержат сведения о сообщении клавиатуры.

wParam [in]

Тип: WPARAM

Идентификатор сообщения клавиатуры.

Этот параметр может иметь одно из следующих сообщений: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN или WM_SYSKEYUP.

lParam [in]

Тип: LPARAM

Указатель на структуру KBDLLHOOKSTRUCT .

Возвращаемое значение

Тип: LRESULT

Если значение nCode меньше нуля, процедура перехватчика должна возвращать значение, возвращаемое CallNextHookEx.

Если nCode больше или равен нулю, а процедура перехватчика не обработала сообщение, настоятельно рекомендуется вызвать CallNextHookEx и вернуть возвращаемое значение; В противном случае другие приложения, установленные WH_KEYBOARD_LL перехватчиками, не будут получать уведомления о перехватчиках и в результате могут работать неправильно.

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

Комментарии

Приложение устанавливает процедуру перехватчика, указывая тип перехватчика WH_KEYBOARD_LL и указатель на процедуру перехватчика в вызове функции SetWindowsHookExASetWindowsHookExA /SetWindowsHookExW.

Этот перехватчик вызывается в контексте потока, который его установил. Вызов выполняется путем отправки сообщения в поток, который установил перехватчик. Таким образом, поток, который установил перехватчик, должен иметь цикл сообщений.

Ввод с клавиатуры может поступать из локального драйвера клавиатуры или вызовов функции keybd_event . Если входные данные поступают из вызова keybd_event, входные данные были внедрены. Однако крючок WH_KEYBOARD_LL не внедряется в другой процесс. Вместо этого контекст переключается обратно к процессу, который установил перехватчик, и он вызывается в исходном контексте. Затем контекст переключается обратно в приложение, создающее событие.

Процедура перехватчика должна обрабатывать сообщение за меньшее время, чем запись данных, указанная в значении LowLevelHooksTimeout в следующем разделе реестра:

HKEY_CURRENT_USER**\**Control Panel**\**Desktop

Значение указывается в миллисекундах. Если время ожидания процедуры перехватчика истекает, система передает сообщение следующему обработчику. Однако в Windows 7 и более поздних версиях перехватчик удаляется без вызова. Приложение не может узнать, удален ли перехватчик.

Windows 10 версии 1709 и более поздних версий Максимальное значение времени ожидания, допустимое системой, составляет 1000 миллисекунд (1 секунда). Система по умолчанию использует время ожидания 1000 миллисекунда, если значение LowLevelHooksTimeout больше 1000.

Примечание

Обработчики отладки не могут отслеживать этот тип низкоуровневых перехватчиков клавиатуры. Если приложение должно использовать низкоуровневые перехватчики, оно должно запускать перехватчики в выделенном потоке, который передает работу рабочему потоку, а затем немедленно возвращается. В большинстве случаев, когда приложению требуется использовать низкоуровневые перехватчики, оно должно отслеживать необработанные входные данные. Это связано с тем, что необработанные входные данные могут асинхронно отслеживать сообщения мыши и клавиатуры, предназначенные для других потоков, более эффективно, чем низкоуровневые перехватчики. Дополнительные сведения о необработанных входных данных см. в разделе Необработанные входные данные.

См. также раздел

CallNextHookEx

KBDLLHOOKSTRUCT

keybd_event

SetWindowsHookEx

WM_KEYDOWN

WM_KEYUP

WM_SYSKEYDOWN

WM_SYSKEYUP

Обработчики

Сведения о перехватчиках