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),尽管此键未扩展.
Han*_*ant 12
它是原始IBM PC上键盘布局的一个古老的实现细节.这就是1981年键盘的样子:

看起来不像今天的键盘.这个演变的额外键被添加,如专用光标键和空格键右侧的Ctrl和Alt键.为了使其与直接读取键盘的现有软件兼容(当时非常常见的犯罪),键盘控制器会使用相同的扫描代码报告这些扩展键,但前面会有一个额外的特殊字节.因此,右侧的Ctrl和Alt键的工作方式与左侧的工作方式相同,如果程序关注区别,则可以检测到与前缀字节的差异.0xE0是该前缀.
许多程序不关心您按下哪个特定键,它们只使用虚拟键代码而不关心它是否是扩展键.就像那些旧的MS-Dos程序没有.这就是为什么你没有看到差异.由于您没有指定扫描代码,因此无法发挥作用.此处提供了 Microsoft的详细文档,其中介绍了键盘扫描代码.
简单(且不完整)的解释是 KEYEVENTF_EXTENDEDKEY 表示“此击键来自数字键盘”
由于大多数程序在您按“q”键上方的“1”时与按数字键盘(这是扩展键)上的“1”时的行为相同 - 您通常不会期望在以下情况下看到任何差异:您在模拟键盘输入时设置此标志。
注意按键位置的程序通常会响应该标志。
bScan 值是原始硬件扫描码。有关扫描码的解释请参见此处http://en.wikipedia.org/wiki/Scancode。与扩展键标志一样,大多数程序不关注扫描码。如果程序希望将键盘视为一堆按钮,则存在这些值。