【问题标题】:Determine whether a virtual-key code belongs to a extended key or a modifier key in .NET确定虚拟键代码是否属于 .NET 中的扩展键或修饰键
【发布时间】:2019-01-12 14:06:33
【问题描述】:

场景

我编写了一个简单的方法,它充当 PostMessage 函数的包装器,用于将击键发送到非活动窗口。此方法将virtual-key code 作为其参数之一。

问题

理论上,修饰键和扩展键不能通过这个函数发送(正如许多专业程序员评论的那样,例如@Hans Passant的this comment),所以,我想以编程方式确定我的方法接收到的虚拟键代码参数是否属于“普通”键、修饰键或扩展键,这样我就可以使用keybd_event 或@987654325 处理这最后两种键类型@ 函数而不是 PostMessage

问题

如何在 C# 或 VB.NET 中实现这一点?我总是可以写一个小的 ifswitch 来检测修饰键,因为它们很少,但我找不到任何可以告诉我虚拟键代码是否是扩展键的 Win32 函数。

老实说,我不知道“扩展”键到底代表什么,我在WM_KEYDOWN / WM_KEYUP docs 上找到了关于此术语的唯一信息,其中说得很肤浅:

扩展键,例如出现的右手 ALT 和 CTRL 键 在增强的 101 或 102 键键盘上。

【问题讨论】:

  • 扩展键是扩展(也称为增强)键盘上的额外键之一。这些是 RCTRL、RALT、Insert、Delete、Num Lock 等键。我自己也做过一些模拟键盘输入的工作,但我认为我没有听说过检查扩展键的内置方法.我认为If 声明将是最好的方法......顺便说一句,你见过这个:Extended-Key Flag - About Keyboard Input
  • 如果您使用ProcessCmdKey 捕获WM_KEYDOWN 上的消息,请使用bool IsExtended = ((int)msg.LParam & 0x1000000) > 0; 测试lParam。您可能对某些键(例如 ALT GR)有分歧。您可能还想捕获WM_SYSCOMMAND

标签: c# .net vb.net keyboard keystroke


【解决方案1】:

AFAIK,PC 键盘上具有 VK 常量的修饰键是 Control、Alt、Shift 和 Windows 键。

扩展密钥未在任何地方正确记录,但测试证实,除了列出的 here

键盘右侧的 ALT 和 CTRL 键; INS, 集群中的 DEL、HOME、END、PAGE UP、PAGE DOWN 和箭头键 数字键盘的左侧;数字锁定键;休息 (CTRL+PAUSE) 键;打印 SCRN 键;以及除号 (/) 和 ENTER 数字键盘中的键

它们是VK_APPSVK_LWINVK_RWINVK_BROWSER_*VK_VOLUME_*VK_MEDIA_*VK_LAUNCH_*

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 2011-08-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多