keybd_event需要KEYEVENTF_EXTENDEDKEY说明

mgu*_*lan 8 c# pinvoke keyboard-events

文档中它说:

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

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

这有什么区别:

keybd_event(RIGHT, 0, 0, 0);
keybd_event(RIGHT, 0, 2, 0);
Run Code Online (Sandbox Code Playgroud)

还有这个:

keybd_event(RIGHT, 0, 1 | 0, 0);
keybd_event(RIGHT, 0, 1 | 2, 0);
Run Code Online (Sandbox Code Playgroud)

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

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

Elm*_*mue 16

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

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

正确答案是只有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
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • [要添加](https://msdn.microsoft.com/en-us/library/ms646267%28v=vs.85%29.aspx):_扩展键标志表示击键消息是否来自其中一个增强型键盘上的其他键.扩展键由键盘右侧的ALT和CTRL键组成; INS,DEL,HOME,END,PAGE UP,PAGE DOWN和数字小键盘左侧群集中的箭头键; NUM LOCK键; BREAK(CTRL + PAUSE)键; PRINT SCRN键; 以及数字键盘中的除法(/)和ENTER键.如果密钥是扩展密钥,则设置扩展密钥标志_ (2认同)

Han*_*ant 12

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

在此输入图像描述

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

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


Joh*_*ler 0

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

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

注意按键位置的程序通常会响应该标志。

bScan 值是原始硬件扫描码。有关扫描码的解释请参见此处http://en.wikipedia.org/wiki/Scancode。与扩展键标志一样,大多数程序不关注扫描码。如果程序希望将键盘视为一堆按钮,则存在这些值。

  • 这个答案是错误的。我不明白为什么人们投票给一个完全错误的答案?扩展标志与键盘完全无关。键盘上唯一需要此标志的键是 VK_DIVIDE 和 VK_NUMLOCK。另一方面,还有其他键需要此标志,并且与键盘完全无关,例如 VK_LWIN 或 VK_RIGHT 或 VK_VOLUME_DOWN。在这里查看我的答案。 (5认同)