キーを押してからアプリケーションに至るまでのキャラクターの構造:
1-PCキーボード:
PCキーボードだけがキーボードの種類ではありませんが、私はそれらに限定します。
PCキーボードは、驚くべきことに文字を理解していません。キーボードボタンを理解しています。これにより、USキーボードで使用されているのと同じハードウェアをQEWERTYまたはDvorakで使用したり、US 101/104キー形式を使用する他の言語の英語で使用したりできます(一部の言語には追加のキーがあります)。
キーボードは標準のスキャンコードを使用してキーを識別し、さらに興味深いことに、特定のコードセットを使用するようにキーボードを構成できます。
セット1-古いXTキーボードで使用されています
セット2-現在使用されており、
セット3は現在誰も使用していないPS/2キーボードで使用されています。
セット1と2は、メイクコードとブレークコードを使用します(つまり、押し下げコードとリリースコード)。セット3は、一部のキー(Shiftなど)に対してのみmakeおよびbreakコードを使用し、文字に対してのみmakeコードを使用します。これにより、キーボード自体が、キーが長押しされたときにキーの繰り返しを処理できるようになります。これは、PS / 2 8086または80286プロセッサからキーリピート処理をオフロードするのに適していますが、ゲームには適していません。
これについて詳しくは、こちらをご覧ください。また、独自の104キーウィンドウキーボードを作成して認定したい場合に備えて、スキャンコードに関するMicrosoftの仕様も見つけました。
いずれの場合も、セット2を使用するPCキーボードを想定できます。つまり、キーが押されたときにコードがコンピューターに送信され、キーが離されたときに1つのコードがコンピューターに送信されます。
ちなみに、USB HID仕様では、キーボードから送信されるスキャンコードは指定されておらず、それらのスキャンコードの送信に使用される構造のみが指定されています。
ハードウェアについて話しているので、これはすべてのオペレーティングシステムに当てはまりますが、すべてのオペレーティングシステムがこれらのコードを処理する方法は異なる場合があります。私は自分自身をWindowsで起こることに制限しますが、他のオペレーティングシステムもほぼ同じ道をたどるべきだと思います。
2-オペレーティングシステム
Windowsがキーボードをどのように正確に処理するのか、どの部分がドライバーによって処理されるのか、どの部分がカーネルによって処理されるのか、そしてどの部分がユーザーモードで処理されるのか正確にはわかりません。ただし、キーボードが定期的にポーリングされてキー状態に変更され、スキャンコードが変換されて仮想キーコードを含むWM_KEYDOWN/WM_KEYUPメッセージに変換されると言えば十分です。正確には、WindowsはWM_SYSKEYUP / WM_SYSKEYDOWNメッセージも生成します。これらのメッセージについて詳しくは、こちらをご覧ください。
3-アプリケーション
それであるWindowsの場合、アプリケーションは生の仮想キーコードを取得し、それらをそのまま使用するか、文字コードに変換するかを決定します。
今日では、正直なC Windowsプログラムを作成する人は誰もいませんが、かつてプログラマーは独自のメッセージポンプ処理コードを展開し、ほとんどのメッセージポンプには次のようなコードが含まれていました。
while (GetMessage( &msg, NULL, 0, 0 ) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
TranslateMessageは魔法が起こる場所です。TranslateMessageのコードは、WM_KEYDOWN(およびWM_SYSKEYDOWN)メッセージを追跡し、WM_CHARメッセージ(およびWM_DEADCHAR、WM_SYSCHAR、WM_SYSDEADCHAR)を生成し
ます。WM_CHARメッセージには、UTF-16(実際にはUCS-2ですが、ヘアを分割できません)コードが含まれます。その時点でアクティブなキーボードレイアウトを考慮して、WM_KEYDOWNメッセージから変換された文字。
Unicodeの前に書かれたアプリケーションはどうですか?これらのアプリケーションは、ANSIバージョンのRegisterClassEx(つまり、RegisterClassExA)を使用してウィンドウを登録しました。この場合、TranslateMessageは、キーボードレイアウトとアクティブなカルチャに基づいて、8ビットの文字コードでWM_CHARメッセージを生成しました。
4-5-キャラクターの派遣と表示。
UIライブラリを使用する最新のコードでは、TranslateMessageを使用せず、WM_KEYDOWNイベントのカスタム変換を行うことは完全に可能です(可能性は低いですが)。標準のウィンドウコントロール(ウィジェット)は、ディスパッチされたWM_CHARメッセージを理解して処理しますが、ウィンドウで実行されているUIライブラリ/ VMは、独自のディスパッチメカニズムを実装できます。
これがあなたの質問に答えることを願っています。