繁体   English   中英

键盘事件:顺序得到保证吗?

[英]Keyboard events: Is the order guaranteed?

按下一个键,可以处理多个事件。

有: KeyDownKeyPressedKeyUp

是否保证应用程序将按该顺序接收那些事件?

我的意思是:是单个按键事件的顺序,而不是一系列不同按键的顺序。

语境:

在遗留C ++应用程序中的按键事件遇到一些问题之后,我用spy++检查了这些事件。 在那里,我看到的是,为了看起来有时不是正确的和keypressed不闪光时,每keydownkeyup

但是,我确定事件应该按照该顺序触发,但在互联网上找不到任何内容。 所以我在这里提出了这个问题。

请注意,这不是多种语言的问题,但是我对C ++,Java和C#是否适用很感兴趣。

在大多数应用中,它们应按发生的顺序进行。 但是您的窗口可能不会为输入的每个字符收到所有事件。

例如,在Windows中,如果按住某个键,则在重复该键时将反复看到KeyDown和/或KeyPressed ,并且在释放键后会看到一个KeyUp

编辑:

现在,我考虑了一下,但是... Windows开始仅将WM_KEYDOWNWM_KEYUP消息发布到您的窗口(并且只有在您有焦点的情况下)。 根据消息循环调用TranslateMessage时的消息发布WM_CHAR消息(类似于KeyPressed )。 这意味着两件事:

  • 如果窗口中有消息积压,那么API 可能只是将消息添加到队列的末尾(IDK); 这对我来说更有意义(消息队列毕竟是队列 ,而不是堆栈),但这的确意味着如果队列中已有该键的WM_KEYUP (例如,用户按下并释放)一个键,而另一个消息正在处理中),相应的WM_CHAR可能会出现后面
  • 诸如C和C ++之类的语言在处理消息方面具有更大的灵活性(阅读:内置自动化程度较低)。 为了让他们获取WM_CHAR消息,他们必须显式调用TranslateMessage或自己进行翻译(除非另一个应用向其发布此类消息)。 对于后者,不会告诉您消息将以什么顺序发布。

另外,如注释中所述,如果在按下某个键时焦点切换了,则可能只会看到KeyUpKeyDown (键状态在焦点切换之前就已经是那样了,Windows可能不会告诉您。)而且,死键(那些不会自行生成字符的键)根本不会触发KeyPressed (尽管它们通常会触发KeyUpKeyDown )。 他们通常只是等待下一个真实角色并对其进行修改。

所有内容的简短说明 :您可以依赖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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM