LowLevelKeyboardProc 函数

说明

SetWindowsHookExA SetWindowsHookExW函数一起使用的应用程序定义或库定义的回调函数。/ 每当新的键盘输入事件即将发布到线程输入队列时,系统都会调用此函数。

注意

调用此回调函数以响应密钥状态的更改时,在更新密钥的异步状态之前调用回调函数。 因此,无法通过从回调函数中调用 GetAsyncKeyState 来确定密钥的异步状态。

HOOKPROC 类型定义指向此回调函数的指针。 LowLevelKeyboardProc 是应用程序定义的或库定义的函数名称的占位符。

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

参数

代码 [in]

类型: int

挂钩过程用于确定如何处理消息的代码。

如果 nCode 小于零,则挂钩过程必须将消息传递给 CallNextHookEx 函数,而无需进一步处理,并且应返回 CallNextHookEx 返回的值。

此参数的取值可为下列值之一:

含义
HC_ACTION 0 wParamlParam 参数包含有关键盘消息的信息。

wParam [in]

类型:WPARAM

键盘消息的标识符。

此参数可以是以下消息之一: WM_KEYDOWNWM_KEYUPWM_SYSKEYDOWNWM_SYSKEYUP

lParam [in]

类型:LPARAM

指向 KBDLLHOOKSTRUCT 结构的指针。

返回

类型: LRESULT

如果 nCode 小于零,则挂钩过程必须返回 CallNextHookEx 返回的值。

如果 nCode 大于或等于零,并且挂钩过程未处理消息,强烈建议调用 CallNextHookEx 并返回它返回的值;否则,安装 WH_KEYBOARD_LL 挂钩的其他应用程序将不会收到挂钩通知,因此行为可能不正确。

如果挂钩过程处理了消息,它可能会返回非零值,以防止系统将消息传递给挂钩链的其余部分或目标窗口过程。

注解

应用程序通过在调用 SetWindowsHookExA/ SetWindowsHookExW 函数中指定WH_KEYBOARD_LL挂钩类型和指向挂钩过程的指针来安装挂钩过程。

此挂钩在安装它的线程的上下文中调用。 调用是通过向安装了挂钩的线程发送消息进行的。 因此,安装挂钩的线程必须具有消息循环。

键盘输入可以来自本地键盘驱动程序,也可以来自对 keybd_event 函数的调用。 如果输入来自对 keybd_event 的调用,则输入已“注入”。 但是, WH_KEYBOARD_LL 挂钩不会注入到另一个进程中。 相反,上下文将切换回安装挂钩的进程,并在其原始上下文中调用它。 然后,上下文切换回生成事件的应用程序。

挂钩过程处理消息的时间应短于以下注册表项的 LowLevelHooksTimeout 值中指定的数据条目:

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

该值以毫秒计。 如果挂钩过程超时,系统会将消息传递到下一个挂钩。 但是,在 Windows 7 及更高版本上,挂钩以静默方式删除,无需调用。 应用程序无法知道挂钩是否已删除。

Windows 10版本 1709 及更高版本 系统允许的最大超时值为 1000 毫秒 (1 秒) 。 如果 LowLevelHooksTimeout 值设置为大于 1000 的值,则系统默认使用 1000 毫秒超时。

注意

调试挂钩无法跟踪这种类型的低级别键盘挂钩。 如果应用程序必须使用低级别挂钩,则应在将工作传递给工作线程,然后立即返回的专用线程上运行挂钩。 在大多数情况下,如果应用程序需要使用低级别挂钩,则应改为监视原始输入。 这是因为原始输入可以异步监视针对其他线程的鼠标和键盘消息,而不是低级别挂钩可以更有效地监视这些消息。 有关原始输入的详细信息,请参阅 原始输入

另请参阅

CallNextHookEx

KBDLLHOOKSTRUCT

keybd_event

SetWindowsHookEx

WM_KEYDOWN

WM_KEYUP

WM_SYSKEYDOWN

WM_SYSKEYUP

挂钩

关于挂钩