[英]Keyboard events: Is the order guaranteed?
按下一个键,可以处理多个事件。
有: KeyDown
, KeyPressed
, KeyUp
。
是否保证应用程序将按该顺序接收那些事件?
我的意思是:是单个按键事件的顺序,而不是一系列不同按键的顺序。
语境:
在遗留C ++应用程序中的按键事件遇到一些问题之后,我用spy++
检查了这些事件。 在那里,我看到的是,为了看起来有时不是正确的和keypressed
不闪光时,每keydown
或keyup
。
但是,我确定事件应该按照该顺序触发,但在互联网上找不到任何内容。 所以我在这里提出了这个问题。
请注意,这不是多种语言的问题,但是我对C ++,Java和C#是否适用很感兴趣。
在大多数应用中,它们应按发生的顺序进行。 但是您的窗口可能不会为输入的每个字符收到所有事件。
例如,在Windows中,如果按住某个键,则在重复该键时将反复看到KeyDown
和/或KeyPressed
,并且在释放键后会看到一个KeyUp
。
现在,我考虑了一下,但是... Windows开始仅将WM_KEYDOWN
和WM_KEYUP
消息发布到您的窗口(并且只有在您有焦点的情况下)。 根据消息循环调用TranslateMessage
时的消息发布WM_CHAR
消息(类似于KeyPressed
)。 这意味着两件事:
WM_KEYUP
(例如,用户按下并释放)一个键,而另一个消息正在处理中),相应的WM_CHAR
可能会出现在它后面 。 WM_CHAR
消息,他们必须显式调用TranslateMessage
或自己进行翻译(除非另一个应用向其发布此类消息)。 对于后者,不会告诉您消息将以什么顺序发布。 另外,如注释中所述,如果在按下某个键时焦点切换了,则可能只会看到KeyUp
或KeyDown
。 (键状态在焦点切换之前就已经是那样了,Windows可能不会告诉您。)而且,死键(那些不会自行生成字符的键)根本不会触发KeyPressed
(尽管它们通常会触发KeyUp
和KeyDown
)。 他们通常只是等待下一个真实角色并对其进行修改。
所有内容的简短说明 :您可以依赖KeyDown
事件相对于彼此出现的顺序。 与KeyPressed
甚至KeyUp
。 但是,至少在Windows中,这三种消息类型并没有真正相互协调。 因此,请不要假定每个KeyUp
都将匹配一个KeyDown
(反之亦然),或者不要假设KeyPressed
出现在KeyUp
之前。
您可能还应该决定是否要处理字符或键 。 我认为,这就是这里混乱的一部分。 两者实际上是不同的概念,并且在大多数情况下,您实际上只关心其中一个。 据称Win32在处理KeyPressed
事件时会告诉您键码,但该事件的真正目的是告诉您输入了什么字符 。 (有一个原因,它被称为WM_CHAR
而不是WM_KEYPRESS
。:)以及为什么.net的KeyPressEventArgs
类型仅具有KeyChar
而不具有KeyCode
。)其他两个将键盘基本上视为一堆按钮。
如果您是Windows用户,这里的经验法则是:通过记录日志或在调试器中检查事件的顺序,然后假定情况总是如此。
这并不完美,但这在95%的情况下都有效。 我无数次听到Windows团队总是回击更改任何事情的故事,因为100%确保这会破坏某些东西。
这是Windows 2.0时代文档不完善的直接结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.