文章目录[隐藏]
在windows中,通常只有很少的方法能够中断一些系统事件.
一个低级的键盘hook,WH_KEYBOARD_LL..
通常,高级的键盘hook,WH_KEYBOARD,是在一个线程的消息队列中被移走的时候截获的.WH_KEYBOARD hook比大多数的应用程序的优先级要高.
然而,有一些击键并没有直接发送到线程的消息队列中. Ctrl+Esc,Alt+Tab就是很好的例子.这些击键在系统的raw输入线程中进行内部处理.由于应用程序不能接收到这些消息,所以应用程序没有办法截获到它们,保护正常的进程.这种行为是为了用户能够切换到另外一个应用程序,不管应用程序的线程已经进入循环,或者挂起.
要中断这些就要用WH_KEYBOARD_LL这个hook将被用于用户输入后,系统接收到它们之前进行处理.
但是这个hook又一个严重的缺点:容易引起无限循环或者挂起. 假如这样发生了,系统就不能正确的处理击键消息了.
为了减轻这种痛苦,微软放了一个时间限制在这个hook上面. 当系统发送一个通知给一个低级键盘hook的过滤函数时,系统给这个函数一定的时间去执行.假如在允许时间内没有返回的话,系统将忽略它.并进行正常处理.这个时间通过LowLevelHooksTimeout值来实现(HKEY_CURRENT_USER\Control Panel\Desktop )
KBDLLHOOKSTRUCT structure
tagKBDLLHOOKSTRUCT | Microsoft Docs https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagkbdllhookstruct
该结构包含有低层键盘输入事件的信息:
typedef struct tagKBDLLHOOKSTRUCT { DWORD vkCode; DWORD scanCode; DWORD flags; DWORD time; ULONG_PTR dwExtraInfo; } KBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
成员:
Members成员
vkCode : Specifies a virtual-key code. The code must be a value in the range 1 to 254.
指定虚拟键值。该值必须在1到254的范围内。
scanCode : Specifies a hardware scan code for the key.
指定键的硬件扫描码。
flags : Specifies the extended-key flag, event-injected flag, context code, and transition-state flag. This member is specified as follows. An application can use the following values to test the keystroke flags.
指定扩展键标志,事件注入标志,上下文代码,转换状态码。成员如下所示。应用程序可以使用下列值来检查键盘敲击标志。
Value值
Purpose目的
LLKHF_EXTENDED
Test the extended-key flag. 测试扩展键标志。
LLKHF_INJECTED
Test the event-injected flag. 测试事件注入标志。
LLKHF_ALTDOWN
Test the context code. 测试上下文代码。
LLKHF_UP
Test the transition-state flag. 测试转换状态码。
0 :Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.
指定该键是否是扩展键,例如:功能键、数字键盘上的键。是扩展键为1,否则为0。
1-3 :Reserved.
保留。
4 :Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0.
指定事件是否被注入。被注入为1,否则为0。
5 :Specifies the context code. The value is 1 if the ALT key is pressed; otherwise, it is 0.
指定上下文代码。如果按下了ALT,该值为1,否则为0
6 :Reserved.
保留。
7 :Specifies the transition state. The value is 0 if the key is pressed and 1 if it is being released.
指定转换状态。如果该键被按下该值为1,如果被释放为0。
time : Specifies the time stamp for this message, equivalent to what GetMessageTime would return for this message.
指定消息的时间戳,相当于GetMessageTime返回的值。
dwExtraInfo : Specifies extra information associated with the message.
指定和该消息相关联的扩展信息。