keybd_event需要KEYEVENTF_EXTENDEDKEY说明

在文档中它说:

KEYEVENTF_EXTENDEDKEY (0x0001):如果指定,则扫描代码前面有一个值为0xE0(224)的前缀字节。

有人能解释这意味着什么吗?

这有什么区别:

keybd_event(RIGHT, 0, 0, 0); keybd_event(RIGHT, 0, 2, 0); 

还有这个:

 keybd_event(RIGHT, 0, 1 | 0, 0); keybd_event(RIGHT, 0, 1 | 2, 0); 

因为当我执行这段代码时,我看不出有什么区别?

另外,什么是“字节bScan”? 在描述中它是:密钥的硬件扫描代码。 那意味着什么?

简单(和不完整)的解释是KEYEVENTF_EXTENDEDKEY表示“此键击来自数字小键盘”

由于大多数程序在“q”键上方的“1”处的行为与在数字键盘上点击“1”(这是一个扩展键)时的行为相同 – 通常情况下,您通常不会看到任何差异。在模拟键盘输入时设置此标志。

注意密钥位置的程序通常会响应此标志。

bScan值是原始硬件扫描码。 有关扫描码的说明,请访问http://en.wikipedia.org/wiki/Scancode 。 与扩展键标志一样,大多数程序都不关注扫描码。 如果程序想要将键盘视为一堆按钮,那么值就在那里。

它是原始IBM PC上键盘布局的古老实现细节。 这就是1981年键盘的样子:

在此处输入图像描述

看起来不像今天的键盘。 这个演变的额外键被添加,如专用光标键和空格键右侧的Ctrl和Alt键。 为了使其与直接读取键盘的现有软件兼容(当时是一种非常常见的犯罪),键盘控制器会使用相同的扫描码报告这些扩展键,但前面会有一个额外的特殊字节。 因此,右侧的Ctrl和Alt键的工作方式与左侧的工作方式相同,如果程序关注区别,则可以检测到与前缀字节的差异。 0xE0是那个前缀。

许多程序不关心您按下哪个特定键,它们只使用虚拟键代码而不关心它是否是扩展键。 就像那些旧的MS-Dos程序没有。 这就是为什么你没有看到差异。 由于您没有指定扫描代码,因此无法发挥作用。 此处提供了 Microsoft的详细文档,其中介绍了键盘扫描代码。

这两个答案都是错的。 我不明白为什么人们投票给错误的答案?

这两个答案都表明这面旗帜无关紧要。 这是完全错误的。 旗帜与键盘无关。

正确的答案是只有01到7F的扫描码,但虚拟键的范围从01到FF。

因此,随着键盘的增长,一些扫描代码必须具有双重赋值。 例如,在我的键盘上,扫描代码0x45被分配给NumLock键和Pause键。

为了区分它们,keyborard发送NumLock密钥的扩展密钥标志,但不发送Pause密钥。

还有其他几个具有双重赋值的键,例如所有媒体键。

运行Visual Studio工具附带的Spy ++并仅过滤WM_KEYDOWN并启用“解码的消息参数”,然后在文本编辑器中点击某些键。

Spy ++将显示标志设置的键和未设置的键。

这里是Spy ++的输出:

 P WM_KEYDOWN nVirtKey:VK_NUMLOCK cRepeat:1 ScanCode:45 fExtended:1 fAltDown:0 fRepeat:0 fUp:0 P WM_KEYDOWN nVirtKey:VK_PAUSE cRepeat:1 ScanCode:45 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 

另一个例子是扫描码2E,它被分配给键盘上的字母“C”和VK_VOLUME_DOWN。

您必须以完全相同的方式对其进行编程,否则键盘注入keybd_event()将失败,因为其他键被击中而不是您想要的键。

不要信任MapVirtualKeyEx(MAPVK_VK_TO_VSC_EX) (> = Vista),因为它不会返回某些键的扩展标志,尽管它们是扩展键,例如VK_LEFT。 此函数中的另一个错误是它返回VK_PAUSE键的扩展标志(E1),尽管此键未扩展。