【发布时间】:2019-01-12 14:06:33
【问题描述】:
场景
我编写了一个简单的方法,它充当 PostMessage 函数的包装器,用于将击键发送到非活动窗口。此方法将virtual-key code 作为其参数之一。
问题
理论上,修饰键和扩展键不能通过这个函数发送(正如许多专业程序员评论的那样,例如@Hans Passant的this comment),所以,我想以编程方式确定我的方法接收到的虚拟键代码参数是否属于“普通”键、修饰键或扩展键,这样我就可以使用keybd_event 或@987654325 处理这最后两种键类型@ 函数而不是 PostMessage。
问题
如何在 C# 或 VB.NET 中实现这一点?我总是可以写一个小的 if 或 switch 来检测修饰键,因为它们很少,但我找不到任何可以告诉我虚拟键代码是否是扩展键的 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