首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要keybd_event KEYEVENTF_EXTENDEDKEY解释

需要keybd_event KEYEVENTF_EXTENDEDKEY解释
EN

Stack Overflow用户
提问于 2014-01-17 22:35:59
回答 3查看 9K关注 0票数 11

文档中,它说:

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

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

这两者之间有什么区别:

代码语言:javascript
运行
复制
keybd_event(RIGHT, 0, 0, 0);
keybd_event(RIGHT, 0, 2, 0);

这是:

代码语言:javascript
运行
复制
keybd_event(RIGHT, 0, 1 | 0, 0);
keybd_event(RIGHT, 0, 1 | 2, 0);

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

另外,“字节bScan”是用来做什么的?在描述中,它是:一个硬件扫描的密钥代码。那是什么意思?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-18 02:59:35

简单(且不完整)的解释是,KEYEVENTF_EXTENDEDKEY的意思是“这个击键来自数字键盘”。

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

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

bScan值是原始硬件扫描代码。有关扫描代码的解释,请看这里的http://en.wikipedia.org/wiki/Scancode。与扩展密钥标志一样,大多数程序都不注意扫描代码。如果程序想把键盘当作一串按钮来处理,这些值就在那里。

票数 0
EN

Stack Overflow用户

发布于 2015-05-27 14:12:15

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

这两个答案都表明,国旗是不相干的。这是完全错误的。国旗和键盘没有关系。

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

因此,随着键盘的发展,一些扫描代码有必要进行双重分配。例如,在我的键盘上,扫描代码0x45分配给NumLock键和暂停键。

为了区分它们,keyborard为NumLock键发送扩展键标志,而不是为暂停键发送扩展键标志。

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

运行Visual工具附带的Spy++,并只过滤WM_KEYDOWN并启用“解码消息参数”,然后按下文本编辑器中的一些键。

Spy++将显示为哪些键设置了标志,哪些键没有设置。

在这里,Spy++的输出:

代码语言:javascript
运行
复制
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),尽管这个键不是扩展的。

票数 22
EN

Stack Overflow用户

发布于 2014-01-18 10:20:45

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

不太像今天的键盘。这样,额外的键就像专用光标键和Ctrl键和Alt键一样添加到空格键的右边。为了使其与直接读取键盘的现有软件兼容(这在当时非常常见),键盘控制器用相同的扫描代码报告那些扩展的键,但前面有一个额外的特殊字节。所以右边的Ctrl和Alt键的工作方式和左边的一样,如果一个程序关心这个区别,那么它就可以从前缀字节中检测出差异。0xE0是那个前缀。

许多程序不关心您按哪个键,它们只是使用虚拟密钥代码,而不关心它是否是扩展密钥。就像那些老的MS程序没有,这就是为什么你看不到任何区别。既然你没有指定扫描代码,那就没有什么区别了。微软描述键盘扫描代码的详细文档是可在这里找到

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21197257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档