低级键盘钩子结构体KBDLLHOOKSTRUCT

一个低级的键盘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.

  指定和该消息相关联的扩展信息。


发布日期:

所属分类: 易语言 标签: