【问题标题】:keybd_event KEYEVENTF_EXTENDEDKEY explanation requiredkeybd_event KEYEVENTF_EXTENDEDKEY 需要解释
【发布时间】:2015-05-27 22:45:03
【问题描述】:

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”?在描述中它是:密钥的硬件扫描代码。这是什么意思?

【问题讨论】:

    标签: c# pinvoke keyboard-events


    【解决方案1】:

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

    两个答案都表明该标志无关紧要。这是完全错误的。而且标志与键盘无关。

    正确的答案是只有01到7F的扫描码,而虚拟键的范围是01到FF。

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

    为了区分它们,键盘为 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),尽管此键未扩展。

    【讨论】:

    • To add from : 扩展键标志指示击键消息是否源自增强键盘上的附加键之一。扩展键由键盘右侧的 ALT 和 CTRL 键组成; INS、DEL、HOME、END、PAGE UP、PAGE DOWN 和数字键盘左侧集群中的箭头键;数字锁定键; BREAK (CTRL+PAUSE) 键;打印 SCRN 键;以及数字键盘中的除 (/) 和 ENTER 键。如果密钥是扩展密钥,则设置扩展密钥标志
    • 我不知道您为什么在此处发布此文本?这是一个非常古老的描述(从 Windows 95 时代开始),不再是最新的。这是不正确的。扩展键比您在帖子中列举的要多得多,例如所有不在键盘右侧的媒体键。
    • 我认为它仍然会添加到您的帖子中,如果您有更新的内容显示所有扩展键,请继续。
    • 我在互联网上搜索了很长的扩展密钥的完整列表,但没有成功,或者数据错误(即使在 MSDN 中你也发现了错误的信息)。所以我建议敲击键盘上的键并观察 Spy++ 记录的内容。这是获取此信息的最简单、最快捷的方式。没有返回可靠信息的 API 真是一场灾难。
    【解决方案2】:

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

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

    许多程序并不关心您按下了哪个特定的键,它们只使用虚拟键代码而不关心它是否是扩展键。就像那些旧的 MS-Dos 程序没有一样。这就是为什么你看不出有什么不同。而且由于您没有指定扫描码,它无法有所作为。来自 Microsoft 的描述键盘扫描代码的详细文档是 available here

    【讨论】:

      【解决方案3】:

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

      由于大多数程序在您按“q”键上方的“1”时的行为与您在数字小键盘(这是一个扩展键)上按“1”时的行为相同 - 您通常不会期望看到在模拟键盘输入时设置此标志有什么不同。

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

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

      【讨论】:

      • 非常感谢您的精彩解释。现在对我来说更清楚了。另外,我在哪里可以得到 EXTENDEDKEY 的完整解释,有文章吗?
      • 这个答案是错误的。我不明白为什么人们投票给一个完全错误的答案?扩展标志与键盘完全无关。键盘上唯一需要这个标志的键是 VK_DIVIDE 和 VK_NUMLOCK。另一方面,还有其他需要此标志的键,并且与 VK_LWIN 或 VK_RIGHT 或 VK_VOLUME_DOWN 等键盘完全无关。在这里查看我的答案。
      • 这个答案有欠缺。这与数字键盘本身无关。 Read here 或下面我的评论
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多