ほとんどのアプリでは、発生時にこの順序で発生する必要があります。ただし、ウィンドウには、入力されたすべての文字のすべてのイベントが表示されるとは限りません。
たとえば、Windowsでは、キーを押したままにすると、キーが繰り返されるときに、KeyDown
および/またはKeyPressed
繰り返し表示され、キーが離されると1つ表示KeyUp
されます。
編集:
しかし、今考えてみると、Windowsはウィンドウへの投稿WM_KEYDOWN
とWM_KEYUP
メッセージのみを開始します(フォーカスがある場合のみ)。 WM_CHAR
メッセージ(Win32の類似物KeyPressed
)は、メッセージループがを呼び出したときのメッセージに基づいて投稿されますTranslateMessage
。これは2つのことを意味します:
- ウィンドウにメッセージのバックログがある場合、APIはメッセージをキューの最後(IDK)に追加するだけの場合があります。これは私にはもっと理にかなっています(メッセージキューは結局のところキュー
WM_KEYUP
であり、スタックではありません)が、キューにそのキーのキーがすでに存在する場合(たとえば、ユーザーがヒットしてリリースした場合)別のメッセージが処理されている間にキー)、対応するものWM_CHAR
がその後に表示される場合があります。
- CやC++のような言語は、メッセージの処理方法に柔軟性があります(読み取り:組み込みの自動化が少ない)。メッセージを受け取るには、明示的
WM_CHAR
に呼び出すかTranslateMessage
、自分で翻訳を行う必要があります(そのようなメッセージを投稿する別のアプリを除く)。後者の場合、メッセージが投稿される順序はわかりません。
また、コメントで述べたように、キーが押されているときにフォーカスが切り替わると、KeyUp
またはが表示される場合がありますKeyDown
。(キーの状態はフォーカススイッチの前にすでにそのようになっていて、Windowsはおそらくそれについて教えてくれません。)そしてデッドキー(それ自体でキャラクターを生成しないもの)はまったくトリガーしませんKeyPressed
(ただしそれらは通常トリガーKeyUp
しますKeyDown
)。彼らは通常、次の実際のキャラクターを待ってそれを変更するだけです。
そのすべての短いバージョンKeyDown
:イベントが相互に関連して表示される順序に依存できます。、、KeyPressed
さらにはKeyUp
。ただし、少なくともWindowsでは、3つのメッセージタイプは実際には相互に調整されていません。したがって、すべてが(またはその逆)にKeyUp
一致するとは限りません。または、の前に表示されます。KeyDown
KeyPressed
KeyUp
おそらく、文字とキーのどちらを処理するかを決定する必要があります。それはここでの混乱の一部だと思います。この2つは実際には異なる概念であり、ほとんどの場合、実際にはどちらか一方しか気にしません。Win32は、イベントを処理するときにキーコードを通知すると言われていますが、KeyPressed
そのイベントの本当の目的は、入力された文字を通知することです。(それが呼ばれWM_CHAR
、ではない理由がありWM_KEYPRESS
ます。:)そして、なぜ.netのKeyPressEventArgs
タイプにはaだけがあり、 .netはKeyChar
ありませんKeyCode
。)他の2つは、キーボードを基本的にボタンの束として扱います。