2

http://www.quirksmode.org/dom/events/keys.htmlから:

keydown ユーザーがキーを押したときに発生します。ユーザーがキーを押したままにしている間、これが繰り返されます。

keypress 実際の文字がテキスト入力などに挿入されたときに発生します。ユーザーがキーを押したままにしている間、これが繰り返されます。

keyup キーのデフォルト アクションが実行された後、ユーザーがキーを離したときに発生します。

C# API: http://msdn.microsoft.com/en-us/library/ff468861(v=vs.85).aspx

キーアップキーダウン

私の質問: C# API にキープレスの 16 進コードが存在しないのはなぜですか?

4

2 に答える 2

1

キープレスの16進コードが存在しないのはなぜですか

Windows メッセージについて話していると思います。それは存在しますが、「キープレス」に近い名前は付けられていません。WM_CHAR メッセージです。C# アプリで KeyPress イベントを生成します。ストア アプリでより適切な名前である CoreWindow.CharacterReceived イベント。

背景を説明すると、このメッセージは TranslateMessage() winapi 関数によって生成されます。メッセージ ループで呼び出す関数。WM_KEYDOWN メッセージを受け取り、そこから WM_CHAR メッセージを合成します。0 個から複数個まで存在できます。この変換を行う関数も公開されています。それはToUnicodeEx()です。仮想キー コード、スキャン コード、現在のキーボードの状態、およびアクティブなキーボード レイアウトがジョブを完了するためにどのように必要であるかに注意してください。キーボードの状態は重要なので、Shift キーを押したままにすると異なる文字が表示されます。キーボード レイアウトは、Windows がさまざまな言語をサポートする方法であり、同じ仮想キー コードを使用してもまったく異なる入力文字が生成されます。

KeyDown イベントからタイピング文字を自分で合成できると思い込まないでください。正確に取得することはできません。一部のキーボード レイアウトではデッド キーを正しく処理できず、別のプロセスのキーボード状態を取得できません。

于 2013-08-05T11:30:23.027 に答える
1

keydown のメッセージで処理されるためです。KEYDOWN のドキュメントには、最初の 16 ビットについて次のように記載されています。

現在のメッセージの繰り返し回数。この値は、ユーザーがキーを押した結果、キーストロークが自動反復される回数です。キーストロークが十分長く保持されると、複数のメッセージが送信されます。ただし、繰り返し回数は累積されません。

したがって、最初の 16 ビットが 0 より大きい場合、それが のフラグですKEYPRESS

独立したフラグではない正確な理由は私にはわかりません。

于 2013-08-05T10:51:02.343 に答える