Lack of VM_KEYPRESS in WinForms?

本文关键字:in WinForms KEYPRESS of VM Lack | 更新日期: 2023-09-27 18:26:31

来源http://www.quirksmode.org/dom/events/keys.html:

按键按下当用户按下某个键时激发。当用户按下按键时,它会重复。

按键当在文本输入中插入实际字符时激发。当用户按下按键时,它会重复。

按键设置当用户在执行某个密钥的默认操作后释放该密钥时激发。

C#API:http://msdn.microsoft.com/en-us/library/ff468861(v=vs.85).aspx

KEYUP,KEYDOWN

我的问题:为什么C#API中不存在按键十六进制代码?

Lack of VM_KEYPRESS in WinForms?

因为它是在keydown的消息中处理的。KEYDOWN的文档说明了前16位:

当前邮件的重复计数。该值是由于用户按住按键而自动重复按键的次数。如果按键保持足够长的时间,则会发送多条消息。但是,重复次数不是累积的。

因此,如果前16位大于0,则这是KEYPRESS的标志。

我不知道它不是一个独立标志的确切原因。

为什么按键十六进制代码不存在

我想你说的是Windows消息。它确实存在,只是并没有被命名为任何接近"按键"的东西。它是WM_CHAR消息。它在C#应用程序中生成KeyPress事件。商店应用程序中更好匹配的名称是CoreWindow.CharacterReceived事件。

在给定一些背景的情况下,此消息是由TranslateMessage()winapi函数生成的。在消息循环中调用的函数。它接收一个WM_KEYDOWN消息,并从中合成WM_CHAR消息。可以有0到几个消息。执行此转换的函数也是公开的,它是ToUnicodeEx()。请注意它需要如何使用虚拟键代码、扫描代码、当前键盘状态和活动键盘布局来完成任务。键盘状态很重要,因此按住Shift键时会得到不同的字符。键盘布局是Windows支持不同语言的方式,并且具有相同的虚拟键代码会产生完全不同的打字字符。

永远不要以为你可以自己合成KeyDown事件中的打字字符,你不可能得到准确的结果。某些键盘布局上的死键无法正确处理,您无法获得其他进程的键盘状态。