在文档中,它说:
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”是用来做什么的?在描述中,它是:一个硬件扫描的密钥代码。那是什么意思?
发布于 2014-01-18 02:59:35
简单(且不完整)的解释是,KEYEVENTF_EXTENDEDKEY的意思是“这个击键来自数字键盘”。
由于大多数程序在“Q”键上方按“1”键时的行为与在数字键盘(这是一个扩展键)上按“1”键时相同--通常情况下,在模拟键盘输入时设置此标志时不会出现任何差异。
注意键位置的程序通常会响应此标志。
bScan值是原始硬件扫描代码。有关扫描代码的解释,请看这里的http://en.wikipedia.org/wiki/Scancode。与扩展密钥标志一样,大多数程序都不注意扫描代码。如果程序想把键盘当作一串按钮来处理,这些值就在那里。
发布于 2015-05-27 14:12:15
这里的两个答案都是错误的。我不明白为什么人们投票赞成错误的答案?
这两个答案都表明,国旗是不相干的。这是完全错误的。国旗和键盘没有关系。
正确的答案是,只有扫描代码从01到7F,但虚拟密钥范围从01到FF。
因此,随着键盘的发展,一些扫描代码有必要进行双重分配。例如,在我的键盘上,扫描代码0x45分配给NumLock键和暂停键。
为了区分它们,keyborard为NumLock键发送扩展键标志,而不是为暂停键发送扩展键标志。
还有其他几个键具有双重赋值,例如,所有媒体键。
运行Visual工具附带的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键的扩展标志(VK_PAUSE),尽管这个键不是扩展的。
发布于 2014-01-18 10:20:45
它是原始IBM上键盘布局的一个古老的实现细节。这就是1981年键盘的样子:
不太像今天的键盘。这样,额外的键就像专用光标键和Ctrl键和Alt键一样添加到空格键的右边。为了使其与直接读取键盘的现有软件兼容(这在当时非常常见),键盘控制器用相同的扫描代码报告那些扩展的键,但前面有一个额外的特殊字节。所以右边的Ctrl和Alt键的工作方式和左边的一样,如果一个程序关心这个区别,那么它就可以从前缀字节中检测出差异。0xE0是那个前缀。
许多程序不关心您按哪个键,它们只是使用虚拟密钥代码,而不关心它是否是扩展密钥。就像那些老的MS程序没有,这就是为什么你看不到任何区别。既然你没有指定扫描代码,那就没有什么区别了。微软描述键盘扫描代码的详细文档是可在这里找到。
https://stackoverflow.com/questions/21197257
复制相似问题