在documentation中说:
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”?在描述中它是:密钥的硬件扫描代码。这意味着什么?
答案 0 :(得分:15)
这两个答案都错了。 我不明白为什么人们投票给错误答案?
两个答案都表明该旗帜无关紧要。这是完全错误的。标志与键盘无关。
正确的答案是只有01到7F的扫描码,但虚拟键的范围是01到FF。
随着键盘的增长,一些扫描码必须具有双重赋值。例如,在我的键盘上,扫描码0x45被分配给NumLock键和Pause键。
为区分它们,keyborard发送NumLock密钥的扩展密钥标志,但不发送暂停密钥。
还有其他几个具有双重赋值的键,例如所有媒体键。
运行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),尽管此键未被扩展。
答案 1 :(得分:11)
这是原始IBM PC上键盘布局的一个古老实现细节。这就是1981年键盘的样子:
看起来不像今天的键盘。这个演变的额外键被添加,如专用光标键和空格键右侧的Ctrl和Alt键。为了使其与直接读取键盘的现有软件兼容(当时非常常见的犯罪),键盘控制器使用相同的扫描代码报告那些扩展键,但在它之前有一个额外的特殊字节。因此,右侧的Ctrl和Alt键的工作方式与左侧的工作方式相同,如果程序关注区别,则可以检测到与前缀字节的差异。 0xE0就是那个前缀。
许多程序不关心您按下哪个特定键,它们只使用虚拟键代码而不关心它是否是扩展键。就像那些旧的MS-Dos程序没有。这就是为什么你没有看到差异。由于您没有指定扫描代码,因此无法产生影响。 Microsoft提供的详细文档描述了键盘扫描码available here。
答案 2 :(得分:0)
简单(和不完整)的解释是KEYEVENTF_EXTENDEDKEY表示“此按键来自数字小键盘”
由于大多数程序在“q”键上方的“1”处的行为与在数字键盘上点击“1”(这是一个扩展键)时的行为相同 - 您通常不会期望看到在模拟键盘输入时设置此标志时有任何区别。
注意密钥的位置的程序通常会响应此标记。
bScan值是原始硬件扫描码。有关扫描码的说明,请查看http://en.wikipedia.org/wiki/Scancode。与扩展键标志一样,大多数程序都不关注扫描码。如果程序想要将键盘视为一组按钮,那么这些值就是存在的。