C# 键盘事件:订单有保证吗?

C# 键盘事件:订单有保证吗?,c#,java,c++,winapi,keyboard,C#,Java,C++,Winapi,Keyboard,按一个键可以处理多个事件 有:向下键,按下键,向上键 是否保证应用程序将按该顺序接收这些事件 我的意思是:是单个按键事件的顺序,而不是一系列不同的按键 背景: P>在遗留C++应用程序中按键问题发生后 我用spy++检查了事件。在那里,我看到命令有时似乎是错误的 不正确,并且并非每次按下或按下按键都会触发按键 但是,我确信事件应该完全按照这个顺序进行,但是 在internet上找不到任何内容。所以我在这里提出了这个问题 请注意,这不是一个多语言的问题,但我对C++、java和c/< > [P>

按一个键可以处理多个事件

有:向下键,按下键,向上键

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

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

背景:

<> P>在遗留C++应用程序中按键问题发生后 我用spy++检查了事件。在那里,我看到命令有时似乎是错误的 不正确,并且并非每次按下或按下按键都会触发按键

但是,我确信事件应该完全按照这个顺序进行,但是 在internet上找不到任何内容。所以我在这里提出了这个问题


请注意,这不是一个多语言的问题,但我对C++、java和c/< > [P>> P >是否感兴趣,如果你是Windows用户,这里的经验法则是:通过日志或调试器检查事件的顺序,然后假定这将总是如此。

这并不完美,但在95%的情况下都有效。我多次听说Windows团队总是推回改变任何事情,因为100%确定这会破坏某些东西


这是Windows 2.0时代糟糕文档的直接结果。

如果您是Windows用户,这里的经验法则是:通过日志记录或在调试器中检查事件顺序,然后假设始终如此

这并不完美,但在95%的情况下都有效。我多次听说Windows团队总是推回改变任何事情,因为100%确定这会破坏某些东西


这是Windows 2.0时代糟糕的文档记录的直接结果。

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

例如,在Windows中,如果按住某个键,则在该键重复时会看到一个向下键和/或向下键被反复按下,而在释放该键后会看到一个向上键

编辑: 现在我想起来了,不过…Windows开始时只会将WM_KEYDOWN和WM_keydup消息发布到您的窗口,并且只有在您有焦点的情况下。Win32 Simulator to KeyPressed的WM_CHAR消息是根据消息循环调用TranslateMessage时的消息发布的。这意味着两件事:

如果窗口有积压的消息,API可能只是将消息添加到队列IDK的末尾;这对我来说更有意义,毕竟消息队列是一个队列,而不是一个堆栈,但这确实意味着如果队列中已经有该键的WM_KEYUP,例如,如果用户在处理另一条消息时点击并释放了一个键,相应的WM_CHAR可能会出现在它之后。 C语言和C++语言有更大的灵活性:在处理消息时,较少的内建自动化;为了获得WM_CHAR消息,他们必须显式调用TranslateMessage,或者自己进行翻译,除非另一个应用程序向其发布此类消息。对于后者,不知道消息的发布顺序。 此外,如注释中所述,如果在某个键按下时焦点切换,则可能只会看到KeyUp或KeyDown。键状态在焦点切换之前就已经是这样了,Windows可能不会告诉您。死键——那些自己不生成角色的键——根本不会触发按下的键,尽管它们通常会触发KeyUp和KeyDown。他们通常只是等待下一个真实角色并修改它

所有这些的简短版本:您可以依赖于按键事件彼此之间的显示顺序。与按下键相同,甚至键向上。但是,至少在Windows中,这三种消息类型并不真正相互协调。因此,不要假设每个KeyUp都与KeyDown匹配,反之亦然,或者KeyPressed出现在KeyUp之前


您可能还应该决定是要处理字符还是键。我认为,这是混乱的一部分;这两个概念实际上是不同的,大多数时候你只关心其中一个。虽然Win32据称会在处理按键事件时告诉您按键代码,但该事件的真正目的是告诉您输入了什么字符。它之所以被称为WM_CHAR而不是WM_KEYPRESS是有原因的:以及为什么.net的KeyPressEventArgs类型只有KeyChar而没有KeyCode。另外两个将键盘视为基本上一组按钮。

在大多数应用程序中,它们的出现顺序应该是这样的。但您的窗口可能不会接收输入的每个字符的每个事件

例如,在Windows中,如果按住某个键,则在该键重复时会看到一个向下键和/或向下键被反复按下,而在释放该键后会看到一个向上键

编辑: 现在我想起来了,不过…Windows一开始只会将WM_KEYDOWN和WM_keydup消息发布到您的w 只有当你集中注意力的时候,你才去做。Win32 Simulator to KeyPressed的WM_CHAR消息是根据消息循环调用TranslateMessage时的消息发布的。这意味着两件事:

如果窗口有积压的消息,API可能只是将消息添加到队列IDK的末尾;这对我来说更有意义,毕竟消息队列是一个队列,而不是一个堆栈,但这确实意味着如果队列中已经有该键的WM_KEYUP,例如,如果用户在处理另一条消息时点击并释放了一个键,相应的WM_CHAR可能会出现在它之后。 C语言和C++语言有更大的灵活性:在处理消息时,较少的内建自动化;为了获得WM_CHAR消息,他们必须显式调用TranslateMessage,或者自己进行翻译,除非另一个应用程序向其发布此类消息。对于后者,不知道消息的发布顺序。 此外,如注释中所述,如果在某个键按下时焦点切换,则可能只会看到KeyUp或KeyDown。键状态在焦点切换之前就已经是这样了,Windows可能不会告诉您。死键——那些自己不生成角色的键——根本不会触发按下的键,尽管它们通常会触发KeyUp和KeyDown。他们通常只是等待下一个真实角色并修改它

所有这些的简短版本:您可以依赖于按键事件彼此之间的显示顺序。与按下键相同,甚至键向上。但是,至少在Windows中,这三种消息类型并不真正相互协调。因此,不要假设每个KeyUp都与KeyDown匹配,反之亦然,或者KeyPressed出现在KeyUp之前


您可能还应该决定是要处理字符还是键。我认为,这是混乱的一部分;这两个概念实际上是不同的,大多数时候你只关心其中一个。虽然Win32据称会在处理按键事件时告诉您按键代码,但该事件的真正目的是告诉您输入了什么字符。它之所以被称为WM_CHAR而不是WM_KEYPRESS是有原因的:以及为什么.net的KeyPressEventArgs类型只有KeyChar而没有KeyCode。另外两个基本上将键盘视为一组按钮。

我认为是吗?否则这句话就会变成:我和穆西一样。我想知道它是否是一个单一的键,不是一系列关键的UPS,关键下降等GARANTETED是顺序的。你当前的应用程序用C,java和C++结合吗?我只能说,哇!我很高兴我不必维护它!这个问题出现在C++应用程序中,但我对java和C也感兴趣。也许这是特定于语言的。为什么不维护它呢?这是遗留代码,我只是好奇顺序是否得到保证,我认为只有在生成一个字符时才会触发KeyPressed。i、 死键和修改键,可能还有一些与输入法相关的东西也不会触发它。我想是吧?否则这句话就会变成:我和穆西一样。我想知道它是否是一个单一的键,不是一系列关键的UPS,关键下降等GARANTETED是顺序的。你当前的应用程序用C,java和C++结合吗?我只能说,哇!我很高兴我不必维护它!这个问题出现在C++应用程序中,但我对java和C也感兴趣。也许这是特定于语言的。为什么不维护它呢?这是遗留代码,我只是好奇顺序是否得到保证,我认为只有在生成一个字符时才会触发KeyPressed。即死锁和修改键,以及一些与IME相关的东西,也不会触发它。此外,考虑死键。还考虑应用程序1接收WMYKEYDOWN,以及APP 2接收相应的WMYKEYUP。顺序是有保证的,但对这些消息尽可能少地假设仍然很重要。键盘输入非常敏感,如果开始感觉像黑客,不要继续这样做谢谢你的全面回答!这正是我所想的,也就是说,不能做出任何假设!我不做任何假设。我个人喜欢听WMYKEYDOWN,而不是WMYCHAR,但这是遗留代码,我不会修复任何不打破。这,再考虑死键。还考虑应用程序1接收WMYKEYDOWN,和APP 2接收相应的WMYKEYUP。顺序是有保证的,但对这些消息尽可能少地假设仍然很重要。键盘输入非常敏感,如果开始感觉像黑客,不要继续这样做谢谢你的全面回答!这正是我所想的,也就是说,不能做出任何假设!我不做任何假设。我个人喜欢听WM_KEYDOWN的音乐
d不是WM_CHAR,但这是遗留代码,我不会修复任何未损坏的代码。按顺序可能是99.99%,但我可以依赖它吗?你怎么能依赖官方文档中未明确表示的任何代码?这正是问题所在。我可以信赖它吗?是否在官方文件中有说明?也许winapi就在这里,我从来没有在MS文档中看到过这样的东西。我敢打赌它不在那里。它可能是在99.99%的顺序,但我可以依赖它吗?你怎么能依赖任何没有在官方文件中明确表达的东西?这正是问题所在。我可以信赖它吗?是否在官方文件中有说明?也许winapi就在这里,我从来没有在MS文档中看到过这样的东西。我敢打赌它不在那里。