gpt4 book ai didi

c# - 键盘事件 : Is the order guaranteed?

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:17 27 4
gpt4 key购买 nike

对于按下单个键,可以处理多个事件。

有:KeyDownKeyPressedKeyUp

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

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

上下文:

在我在遗留 C++ 应用程序中遇到按键事件问题之后我用 spy++ 检查了事件。在那里我看到订单有时似乎不正确并且 keypressed 不会针对每个 keydownkeyup 触发。

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

请注意,这不是多语言问题,但我很想知道 C++、Java 和 C# 是否也是如此。

最佳答案

在大多数应用程序中,当它们发生时它们应该按那个顺序发生。但是您的窗口可能不会收到输入的每个字符的每个事件。

例如,在 Windows 中,如果您按住一个键,您将看到 KeyDown和/或 KeyPressed随着键的重复而重复,并且单个 KeyUp一旦释放 key 。

编辑:

现在我想起来了,虽然...Windows 开始时只发布 WM_KEYDOWNWM_KEYUP消息到您的窗口(并且仅当您有焦点时)。 WM_CHAR消息(类似于 KeyPressed 的 Win32)根据消息循环调用 TranslateMessage 时的消息发布。 .这意味着两件事:

  • 如果窗口有消息积压,API 可能只是将消息添加到队列的末尾 (IDK);这对我来说更有意义(消息队列毕竟是一个队列,而不是一个堆栈),但这确实意味着如果已经有一个WM_KEYUP对于队列中的那个键(例如,如果用户在处理另一条消息时按下并释放了一个键),相应的 WM_CHAR可能会出现在之后
  • C 和 C++ 等语言在处理消息的方式上具有更大的灵 active (读作:更少的内置自动化);为了让他们得到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 .) 其他两个基本上将键盘视为一堆按钮。

关于c# - 键盘事件 : Is the order guaranteed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594693/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com