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 | 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 挂钩的其他应用程序将不会收到挂钩通知,因此行为可能不正确。
如果挂钩过程处理了消息,它可能会返回非零值,以防止系统将消息传递给挂钩链的其余部分或目标窗口过程。
注解
应用程序通过在调用 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 毫秒超时。
注意
调试挂钩无法跟踪这种类型的低级别键盘挂钩。 如果应用程序必须使用低级别挂钩,则应在将工作传递给工作线程,然后立即返回的专用线程上运行挂钩。 在大多数情况下,如果应用程序需要使用低级别挂钩,则应改为监视原始输入。 这是因为原始输入可以异步监视针对其他线程的鼠标和键盘消息,而不是低级别挂钩可以更有效地监视这些消息。 有关原始输入的详细信息,请参阅 原始输入。