キーボード入力について

アプリケーションでは、キーボードとマウスからのユーザー入力を受け入れる必要があります。 アプリケーションは、ウィンドウに投稿されたメッセージの形式でキーボード入力を受け取ります。

このセクションは、次のトピックで構成されています。

キーボード入力モデル

システムは、現在のキーボードに適したキーボード デバイス ドライバーをインストールすることで、アプリケーションにデバイスに依存しないキーボード サポートを提供します。 システムは、ユーザーまたはアプリケーションによって現在選択されている言語固有のキーボード レイアウトを使用して、言語に依存しないキーボード サポートを提供します。 キーボード デバイス ドライバーは、キーボードからスキャン コードを受け取り、キーボード レイアウトに送信され、そこでメッセージに変換され、アプリケーションの適切なウィンドウにポストされます。

キーボードの各キーに割り当てられるのは、 スキャン コードと呼ばれる一意の値であり、キーボード上のキーのデバイスに依存する識別子です。 キーボードは、ユーザーがキーを入力すると 2 つのスキャン コードを生成します。1 つはユーザーがキーを押したとき、もう 1 つはユーザーがキーを離したときです。

キーボード デバイス ドライバーは、スキャン コードを解釈し、それを 仮想キー コード (キーの目的を識別するシステムによって定義されるデバイスに依存しない値) に変換 (マップ) します。 スキャン コードを変換すると、キーボード レイアウトによって、スキャン コード、仮想キー コード、キーストロークに関するその他の情報を含むメッセージが作成され、メッセージがシステム メッセージ キューに配置されます。 システムは、システム・メッセージ待ち行列からメッセージを除去し、それを適切なスレッドのメッセージ待ち行列にポストします。 最終的に、スレッドのメッセージ ループはメッセージを削除し、処理のために適切なウィンドウ プロシージャに渡します。 次の図は、キーボード入力モデルを示しています。

keyboard input processing model

キーボード フォーカスとアクティブ化

システムは、キーボード フォーカスを使用してウィンドウを作成したフォアグラウンド スレッドのメッセージ キューにキーボード メッセージをポストします。 キーボード フォーカスは、ウィンドウの一時的なプロパティです。 システムは、キーボードフォーカスをユーザーの方向に、あるウィンドウから別のウィンドウにシフトすることで、ディスプレイ上のすべてのウィンドウ間でキーボードを共有します。 キーボード フォーカスがあるウィンドウは、フォーカスが別のウィンドウに変わるまで、すべてのキーボード メッセージを (作成したスレッドのメッセージ キューから) 受け取ります。

スレッドは GetFocus 関数を呼び出して、現在キーボード フォーカスを持っているウィンドウ (存在する場合) を判断できます。 スレッドは 、SetFocus 関数を呼び出すことによって、いずれかのウィンドウにキーボード フォーカスを与えることができます。 キーボード フォーカスが 1 つのウィンドウから別のウィンドウに変更されると、システムはフォーカスを失ったウィンドウに WM_KILLFOCUS メッセージを送信し、フォーカスを取得したウィンドウに WM_SETFOCUS メッセージを送信します。

キーボード フォーカスの概念は、アクティブ ウィンドウの概念に関連しています。 アクティブなウィンドウは、ユーザーが現在操作している最上位のウィンドウです。 キーボード フォーカスがあるウィンドウは、アクティブ ウィンドウまたはアクティブ ウィンドウの子ウィンドウです。 ユーザーがアクティブなウィンドウを識別できるように、システムは Z の順序の一番上に配置し、タイトル バー (存在する場合) と境界線を強調表示します。

ユーザーは、トップレベル ウィンドウをクリックするか、Alt + Tab キーまたは Alt + Esc キーの組み合わせを使用して選択するか、タスク リストから選択することでアクティブ化できます。 スレッドは 、SetActiveWindow 関数を使用してトップレベル ウィンドウをアクティブ化できます。 GetActiveWindow 関数を使用して、作成した最上位のウィンドウがアクティブかどうかを判断できます。

1 つのウィンドウが非アクティブ化され、もう 1 つのウィンドウがアクティブになると、 システムはWM_ACTIVATE メッセージを送信します。 wParam パラメーターの下位ワードは、ウィンドウが非アクティブ化されている場合は 0 で、アクティブ化されている場合は 0 以外です。 既定のウィンドウ プロシージャは、 WM_ACTIVATE メッセージを受け取ると、キーボード フォーカスをアクティブ ウィンドウに設定します。

キーボードとマウスの入力イベントがアプリケーションに到達するのをブロックするには、 BlockInput を使用します。 BlockInput 関数は、非同期キーボード入力状態テーブルに干渉しないことに注意してください。 つまり、入力がブロックされている間に SendInput 関数を呼び出すと、非同期キーボード入力状態テーブルが変更されます。

キーストローク メッセージ

キーを押すと、キーボード フォーカスがあるウィンドウ に接続されている スレッド メッセージ キュー にWM_KEYDOWNまたはWM_SYSKEYDOWN メッセージが配置されます。 キーを解放すると、 WM_KEYUP または WM_SYSKEYUP メッセージがキューに配置されます。

通常、キーアップメッセージとキーダウンメッセージはペアで行われますが、ユーザーがキーボードの自動繰り返し機能を開始するのに十分な長さのキーを押すと、システムは多数の WM_KEYDOWN またはWM_SYSKEYDOWNメッセージを 1 行に生成します。 その後、ユーザーがキーを離したときに、1 つの WM_KEYUP または WM_SYSKEYUP メッセージが生成されます。

このセクションは、次のトピックで構成されています。

システムキーストロークと非システムキーストローク

システムは、システムキーストロークと非システムキーストロークを区別します。 システムキーストロークは、システムのキーストロークメッセージ、 WM_SYSKEYDOWN および WM_SYSKEYUPを生成します。 非システム キーストロークでは、非システム キーストローク メッセージ、 WM_KEYDOWNWM_KEYUPが生成されます。

ウィンドウ プロシージャでシステム キーストローク メッセージを処理する必要がある場合は、メッセージの処理後にプロシージャが DefWindowProc 関数に渡されることを確認します。 それ以外の場合、ウィンドウにキーボード フォーカスがある場合は常に、Alt キーを含むすべてのシステム操作が無効になります。 つまり、ユーザーはウィンドウのメニューやシステム メニューにアクセスすることも、Alt + Esc キーまたは Alt + Tab キーの組み合わせを使用して別のウィンドウをアクティブにすることもできません。

システム のキーストローク メッセージは、主にアプリケーションではなくシステムで使用されます。 システムは、組み込みのキーボード インターフェイスをメニューに提供し、アクティブなウィンドウをユーザーが制御できるようにするために使用します。 システム キーストローク メッセージは、ユーザーが Alt キーと組み合わせてキーを入力したとき、またはユーザーが入力したウィンドウにキーボード フォーカスがない場合 (アクティブなアプリケーションが最小化されている場合など) に生成されます。 この場合、メッセージは、アクティブウィンドウに添付されたメッセージキューにポストされます。

非システム キーストローク メッセージは、アプリケーション ウィンドウで使用されます。 DefWindowProc 関数はそれらに対して何もしません。 ウィンドウ プロシージャは、不要なシステム以外のキーストローク メッセージを破棄できます。

説明されているVirtual-Key コード

キーストローク メッセージの wParam パラメーターには、押されたか解放されたキーの仮想キー コードが含まれています。 ウィンドウ プロシージャは、仮想キー コードの値に応じて、キーストローク メッセージを処理または無視します。

一般的なウィンドウ プロシージャでは、キーストローク メッセージのごく一部のみが処理され、それ以外のメッセージは無視されます。 たとえば、ウィンドウ プロシージャでは、 WM_KEYDOWN キーストローク メッセージのみを処理し、カーソル移動キー、シフト キー (制御キーとも呼ばれます)、ファンクション キーの仮想キー コードを含むメッセージのみを処理できます。 一般的なウィンドウ プロシージャでは、文字キーからのキーストローク メッセージは処理されません。 代わりに、 TranslateMessage 関数を使用してメッセージを文字メッセージに変換します。 TranslateMessage と文字メッセージの詳細については、「文字メッセージ」を参照してください。

キーストローク メッセージ フラグ

キーストローク メッセージの lParam パラメーターには、メッセージを生成したキーストロークに関する追加情報が含まれています。 この情報には、 繰り返し数スキャン コード拡張キー フラグコンテキスト コード、前の キー状態フラグおよび遷移状態フラグが含まれます。 次の図は、 lParam パラメーター内のこれらのフラグと値の場所を示しています。

the locations of the flags and values in the lparam parameter of a keystroke message

アプリケーションでは、次の値を使用して 、lParam の上位ワードからキーストローク フラグを取得できます。

説明
KF_EXTENDED
0x0100
拡張キー フラグを操作します。
KF_DLGMODE
0x0800
ダイアログ ボックスがアクティブかどうかを示すダイアログ モード フラグを操作します。
KF_MENUMODE
0x1000
メニューがアクティブかどうかを示すメニュー モード フラグを操作します。
KF_ALTDOWN
0x2000
コンテキスト コード フラグを操作します。
KF_REPEAT
0x4000
前のキー状態フラグを操作します。
KF_UP
0x8000
遷移状態フラグを操作します。

コード例:

case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
    WORD vkCode = LOWORD(wParam);                                 // virtual-key code
    
    WORD keyFlags = HIWORD(lParam);

    WORD scanCode = LOBYTE(keyFlags);                             // scan code
    BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
    
    if (isExtendedKey)
        scanCode = MAKEWORD(scanCode, 0xE0);

    BOOL repeatFlag = (keyFlags & KF_REPEAT) == KF_REPEAT;        // previous key-state flag, 1 on autorepeat
    WORD repeatCount = LOWORD(lParam);                            // repeat count, > 0 if several keydown messages was combined into one message

    BOOL upFlag = (keyFlags & KF_UP) == KF_UP;                    // transition-state flag, 1 on keyup

    // if we want to distinguish these keys:
    switch (vkCode)
    {
    case VK_SHIFT:   // converts to VK_LSHIFT or VK_RSHIFT
    case VK_CONTROL: // converts to VK_LCONTROL or VK_RCONTROL
    case VK_MENU:    // converts to VK_LMENU or VK_RMENU
        vkCode = LOWORD(MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX));
        break;
    }

    // ...
}
break;

繰り返し回数

繰り返し数を確認して、キーストローク メッセージが複数のキーストロークを表しているかどうかを判断できます。 システムは、キーボードがメッセージを処理するよりも速く WM_KEYDOWN または WM_SYSKEYDOWN メッセージを生成するときにカウントをインクリメントします。 これは多くの場合、ユーザーがキーボードの自動繰り返し機能を開始するのに十分な長さにキーを押し続けると発生します。 システム メッセージ キューに結果のキーダウン メッセージを入力する代わりに、メッセージを 1 つのキーダウン メッセージに結合し、繰り返し数を増やします。 キーを解放しても自動繰り返し機能を開始できないため、 WM_KEYUP メッセージと WM_SYSKEYUP メッセージの繰り返し数は常に 1 に設定されます。

スキャン コード

スキャン コードは、ユーザーがキーを押したときにキーボード ハードウェアによって生成される値です。 これは、キーによって表される文字ではなく、押されたキーを識別するデバイス依存の値です。 通常、アプリケーションはスキャン コードを無視します。 代わりに、デバイスに依存しない仮想キー コードを使用して、キーストローク メッセージを解釈します。

Extended-Key フラグ

拡張キー フラグは、拡張 101/102 キー キーボードの追加キーの 1 つからキーストローク メッセージが送信されたかどうかを示します。 拡張キーは、キーボードの右側にある Alt キーと Ctrl キーで構成されます。テンキーの左側にあるクラスター内の INS、DEL、HOME、END、PAGE UP、PAGE DOWN、および方向キー。NUM LOCK キー。BREAK (Ctrl + PAUSE) キー。PRINT SCRN キー。テンキーの除算 (/) キーと ENTER キーを使用します。 右側の Shift キーは拡張キーとは見なされず、代わりに別のスキャン コードがあります。

指定した場合、スキャン コードは 2 バイトのシーケンスで構成されます。最初のバイトの値は 0xE0。

コンテキスト コード

コンテキスト コードは、キーストローク メッセージが生成されたときに Alt キーがダウンしたかどうかを示します。 Alt キーがダウンした場合はコードは 1、稼働していた場合は 0 です。

前のKey-State フラグ

前のキー状態フラグは、キーストローク メッセージを生成したキーが以前にアップまたはダウンしたかどうかを示します。 キーが以前にダウンしていた場合は 1、キーが前にアップしていた場合は 0 です。 このフラグを使用すると、キーボードの自動繰り返し機能によって生成されたキーストローク メッセージを識別できます。 このフラグは、自動繰り返し機能によって生成される WM_KEYDOWN および WM_SYSKEYDOWN キーストローク メッセージに対して 1 に設定されます。 WM_KEYUPメッセージとWM_SYSKEYUPメッセージの場合、常に 1 に設定されます。

Transition-State フラグ

遷移状態フラグは、キーを押すか、キーを解放してキーストローク メッセージを生成したかを示します。 このフラグは、メッセージのWM_KEYDOWNWM_SYSKEYDOWNの場合は常に 0 に設定されます。WM_KEYUPメッセージとWM_SYSKEYUPメッセージの場合は常に 1 に設定されます。

文字メッセージ

キーストローク メッセージはキーストロークに関する多くの情報を提供しますが、文字キーストロークの文字コードは提供しません。 文字コードを取得するには、アプリケーションのスレッド メッセージ ループに TranslateMessage 関数を含める必要があります。 TranslateMessage は、 WM_KEYDOWN または WM_SYSKEYDOWN メッセージをキーボード レイアウトに渡します。 レイアウトはメッセージの仮想キー コードを調べ、文字キーに対応する場合は、(Shift キーと CAPS LOCK キーの状態を考慮して) 同等の文字コードを提供します。 次に、文字コードを含む文字メッセージを生成し、メッセージをメッセージ キューの先頭に配置します。 メッセージ ループの次のイテレーションでは、キューから文字メッセージが削除され、メッセージが適切なウィンドウ プロシージャにディスパッチされます。

このセクションは、次のトピックで構成されています。

非システム文字メッセージ

ウィンドウ プロシージャは、WM_CHARWM_DEADCHAR、WM_SYSCHARWM_SYSDEADCHARおよびWM_UNICHARという文字メッセージを受け取ることができます。 TranslateMessage 関数は、WM_KEYDOWN メッセージを処理するときに、WM_CHARまたはWM_DEADCHARメッセージを生成します。 同様に、WM_SYSKEYDOWN メッセージを処理すると、WM_SYSCHARまたはWM_SYSDEADCHAR メッセージが生成されます。

キーボード入力を処理するアプリケーションは、通常、 WM_CHAR メッセージと WM_UNICHAR メッセージを除くすべてのメッセージを無視し、その他のメッセージを DefWindowProc 関数に渡します。 WM_CHARでは UTF-16 (16 ビット Unicode 変換形式) または ANSI 文字セットが使用されますが、WM_UNICHARでは常に UTF-32 (32 ビット Unicode 変換形式) が使用されることに注意してください。 システムは 、WM_SYSCHAR メッセージと WM_SYSDEADCHAR メッセージを使用してメニューニーモニックを実装します。

すべての文字メッセージの wParam パラメーターには、押された文字キーの文字コードが含まれています。 文字コードの値は、メッセージを受信するウィンドウのウィンドウ クラスによって異なります。 RegisterClass 関数の Unicode バージョンを使用してウィンドウ クラスを登録した場合、システムはそのクラスのすべてのウィンドウに Unicode 文字を提供します。 それ以外の場合、システムは ANSI 文字コードを提供します。 詳細については、「ウィンドウ クラスの登録」および「Windows アプリでの UTF-8 コード ページの使用」を参照してください。

文字メッセージの lParam パラメーターの内容は、文字メッセージを生成するために変換されたキーダウン メッセージの lParam パラメーターの内容と同じです。 詳細については、「 キーストローク メッセージ フラグ」を参照してください。

メッセージのDead-Character

一部の英語以外のキーボードには、単独で文字を生成することが想定されていない文字キーが含まれています。 代わりに、後続のキーストロークによって生成される文字に分音記号を追加するために使用されます。 これらのキーは 、デッド キーと呼ばれます。 ドイツ語キーボードの circumflex キーは、デッド キーの例です。 "o" で構成される文字を circumflex で入力するには、ドイツのユーザーが circumflex キーを入力し、その後に "o" キーを入力します。 キーボード フォーカスのあるウィンドウには、次の一連のメッセージが表示されます。

  1. WM_KEYDOWN
  2. WM_DEADCHAR
  3. WM_KEYUP
  4. WM_KEYDOWN
  5. WM_CHAR
  6. WM_KEYUP

TranslateMessage は、配信不能キーから WM_KEYDOWN メッセージを処理するときに 、WM_DEADCHAR メッセージを生成します。 WM_DEADCHAR メッセージの wParam パラメーターには、配信不能キーの分音記号の文字コードが含まれていますが、通常、アプリケーションはメッセージを無視します。 代わりに、後続のキーストロークによって生成された WM_CHAR メッセージを処理します。 WM_CHAR メッセージの wParam パラメーターには、分音記号を含む文字の文字コードが含まれています。 後続のキーストロークで、分音記号と組み合わせることができない文字が生成された場合、システムは 2 つの WM_CHAR メッセージを生成します。 最初の wParam パラメーターには、分音記号の文字コードが含まれています。2 番目の wParam パラメーターには、後続の文字キーの文字コードが含まれています。

TranslateMessage 関数は、システムの配信不能キー (Alt キーと組み合わせて押されたデッド キー) からWM_SYSKEYDOWN メッセージを処理するときに、WM_SYSDEADCHAR メッセージを生成します。 アプリケーションは通常、 WM_SYSDEADCHAR メッセージを無視します。

キーの状態

キーボード メッセージの処理中に、アプリケーションは、現在のメッセージを生成したキー以外の別のキーの状態を確認する必要がある場合があります。 たとえば、ユーザーが Shift キーを押しながら END キーを押してテキスト ブロックを選択できるようにするワープロ アプリケーションでは、END キーからキーストローク メッセージを受信するたびに Shift キーの状態を確認する必要があります。 アプリケーションでは 、GetKeyState 関数を使用して、現在のメッセージが生成された時点での仮想キーの状態を確認できます。 GetAsyncKeyState 関数を使用して、仮想キーの現在の状態を取得できます。

キーボード レイアウトでは、名前の一覧が保持されます。 1 つの文字を生成するキーの名前は、キーによって生成される文字と同じです。 TAB や ENTER などの文字以外のキーの名前は、文字列として格納されます。 アプリケーションは 、GetKeyNameText 関数を呼び出すことによって、デバイス ドライバーから任意のキーの名前を取得できます。

キーストロークと文字翻訳

このシステムには、さまざまなキーストローク メッセージによって提供されるスキャン コード、文字コード、仮想キー コードを変換する特殊な目的の関数がいくつか含まれています。 これらの関数には、 MapVirtualKeyToAsciiToUnicodeVkKeyScan が含まれます。

さらに、Microsoft Rich Edit 3.0 では HexToUnicode IME がサポートされています。これにより、ユーザーはホット キーを使用して 16 進文字と Unicode 文字を変換できます。 つまり、Microsoft Rich Edit 3.0 がアプリケーションに組み込まれると、アプリケーションは HexToUnicode IME の機能を継承します。

Hot-Key サポート

ホット キーは、WM_HOTKEY メッセージを生成するキーの組み合わせで、システムがスレッドのメッセージ キューの先頭に配置し、キュー内の既存のメッセージをバイパスします。 アプリケーションでは、ホット キーを使用して、ユーザーから優先度の高いキーボード入力を取得します。 たとえば、Ctrl + C キーの組み合わせで構成されるホット キーを定義することで、アプリケーションでは、ユーザーが長い操作を取り消すことができます。

ホット キーを定義するために、アプリケーションは RegisterHotKey 関数を呼び出し、 WM_HOTKEY メッセージを生成するキーの組み合わせ、メッセージを受信するウィンドウへのハンドル、ホット キーの識別子を指定します。 ユーザーがホット キーを押すと、ウィンドウを作成したスレッドのメッセージ キューに WM_HOTKEY メッセージが配置されます。 メッセージの wParam パラメーターには、ホット キーの識別子が含まれています。 アプリケーションはスレッドに対して複数のホット キーを定義できますが、スレッド内の各ホット キーには一意の識別子が必要です。 アプリケーションが終了する前に、 UnregisterHotKey 関数を使用してホット キーを破棄する必要があります。

アプリケーションでは、ホット キー コントロールを使用して、ユーザーがホット キーを簡単に選択できるようにします。 ホット キー コントロールは、通常、ウィンドウをアクティブにするホット キーを定義するために使用されます。 RegisterHotKey 関数と UnregisterHotKey 関数は 使用しません。 代わりに、ホット キー コントロールを使用するアプリケーションは、通常、 WM_SETHOTKEY メッセージを 送信してホット キーを設定します。 ユーザーがホット キーを押すたびに、システムはSC_HOTKEYを指定する WM_SYSCOMMAND メッセージを送信します。 ホット キー コントロールの詳細については、「ホット キー コントロールの使用」を参照してください。

ブラウズやその他の機能のキーボード キー

Windowsでは、ブラウザー機能、メディア機能、アプリケーション起動、電源管理用の特別なキーを備えたキーボードがサポートされます。 WM_APPCOMMANDでは、追加のキーボード キーがサポートされます。 さらに、 ShellProc 関数は、追加のキーボード キーをサポートするように変更されています。

コンポーネント アプリケーションの子ウィンドウで、これらの追加のキーボード キーのコマンドを直接実装することはほとんどありません。 したがって、これらのキーのいずれかが押されると、 DefWindowProcWM_APPCOMMAND メッセージをウィンドウに送信します。 DefWindowProc は、 WM_APPCOMMAND メッセージを親ウィンドウにバブルします。 これは、右マウス ボタンを使用してコンテキスト メニューを呼び出す方法と似ています。 つまり、DefWindowProc は右ボタン クリック でWM_CONTEXTMENU メッセージを送信し、親にバブルします。 さらに、 DefWindowProc が最上位ウィンドウの WM_APPCOMMAND メッセージを受信すると、コード HSHELL_APPCOMMANDを含むシェル フックが呼び出されます。

Windowsは、5 つのボタンを持つマウスである Microsoft IntelliMouse Explorer もサポートしています。 2 つの追加ボタンは、前方および後方のブラウザー ナビゲーションをサポートします。 詳細については、「 XBUTTON」を参照してください。

入力のシミュレート

中断のない一連のユーザー入力イベントをシミュレートするには、 SendInput 関数を使用します。 この関数は、3 つのパラメーターを受け取ります。 最初のパラメーター cInputs は、シミュレートされる入力イベントの数を示します。 2 番目のパラメーター rgInputs、入力 イベントの種類とそのイベントに関する追加情報を記述する INPUT 構造体の配列です。 最後のパラメーター cbSize は、 INPUT 構造体のサイズをバイト単位で受け取ります。

SendInput 関数は、シミュレートされた一連の入力イベントをデバイスの入力ストリームに挿入することによって機能します。 この効果は 、keybd_event 関数または mouse_event 関数を繰り返し呼び出すのと似ていますが、シミュレートされたイベントと他の入力イベントが混在しないようにシステムによって保証される点が異なります。 呼び出しが完了すると、戻り値は、正常に再生された入力イベントの数を示します。 この値が 0 の場合、入力はブロックされました。

SendInput 関数は、キーボードの現在の状態をリセットしません。 したがって、この関数を呼び出すときに押されたキーがユーザーにある場合は、この関数が生成するイベントに干渉する可能性があります。 干渉の可能性が心配な場合は、 GetAsyncKeyState 関数を使用してキーボードの状態を確認し、必要に応じて修正します。

言語、ロケール、キーボード レイアウト

言語は、英語、フランス語、日本語などの自然言語です。 サブ言語は、英国で話される英語のサブ言語や米国など、特定の地理的地域で話される自然言語の変種です。 アプリケーションでは、 言語識別子と呼ばれる値を使用して、言語とサブ言語を一意に識別します。

アプリケーションでは通常、 ロケール を使用して、入力と出力を処理する言語を設定します。 たとえば、キーボードのロケールを設定すると、キーボードによって生成される文字値に影響します。 ディスプレイまたはプリンターのロケールを設定すると、表示または印刷されるグリフに影響します。 アプリケーションでは、キーボード レイアウトを読み込んで使用することで、キーボードのロケールを設定します。 指定したロケールをサポートするフォントを選択して、ディスプレイまたはプリンターのロケールを設定します。

キーボード レイアウトは、キーボード上のキーの物理的な位置を指定するだけでなく、それらのキーを押すことによって生成される文字値も決定します。 各レイアウトは、現在の入力言語を識別し、どの文字値がどのキーとキーの組み合わせによって生成されているかを決定します。

すべてのキーボード レイアウトには、レイアウトと言語を識別する対応するハンドルがあります。 ハンドルの低い単語は言語識別子です。 高い単語は、物理レイアウトを指定するデバイス ハンドル、または既定の物理レイアウトを示す 0 です。 ユーザーは、任意の入力言語を物理レイアウトに関連付けることができます。 たとえば、フランス語で非常に頻繁に働く英語を話すユーザーは、キーボードの物理的なレイアウトを変更することなく、キーボードの入力言語をフランス語に設定できます。 つまり、ユーザーは使い慣れた英語レイアウトを使用して、フランス語でテキストを入力できます。

通常、アプリケーションは入力言語を直接操作することは想定されていません。 代わりに、ユーザーは言語とレイアウトの組み合わせを設定し、その間で切り替えます。 ユーザーが別の言語でマークされたテキストをクリックすると、アプリケーションは ActivateKeyboardLayout 関数を呼び出して、その言語のユーザーの既定のレイアウトをアクティブにします。 ユーザーがアクティブなリストにない言語でテキストを編集した場合、アプリケーションは言語で LoadKeyboardLayout 関数を呼び出して、その言語に基づくレイアウトを取得できます。

ActivateKeyboardLayout 関数は、現在のタスクの入力言語を設定します。 hkl パラメーターには、キーボード レイアウトへのハンドルまたは 0 から拡張された言語識別子を指定できます。 キーボード レイアウト ハンドルは、 LoadKeyboardLayout または GetKeyboardLayoutList 関数から取得できます。 HKL_NEXTHKL_PREVの値を使用して、次または前のキーボードを選択することもできます。

GetKeyboardLayoutName 関数は、呼び出し元スレッドのアクティブなキーボード レイアウトの名前を取得します。 アプリケーションが LoadKeyboardLayout 関数を使用してアクティブなレイアウトを作成する場合、GetKeyboardLayoutName はレイアウトの作成に使用されたのと同じ文字列を取得します。 それ以外の場合、文字列は、アクティブなレイアウトのロケールに対応するプライマリ言語識別子です。 つまり、関数は必ずしも同じ主言語を持つ異なるレイアウト間で区別できるとは限らないため、入力言語に関する特定の情報を返すことはできません。 ただし、 GetKeyboardLayout 関数を使用して入力言語を決定できます。

LoadKeyboardLayout 関数はキーボード レイアウトを読み込み、ユーザーがレイアウトを使用できるようにします。 アプリケーションでは、 KLF_ACTIVATE 値を使用して、現在のスレッドのレイアウトをすぐにアクティブにすることができます。 アプリケーションでは 、KLF_REORDER 値を使用して、 KLF_ACTIVATE 値も指定せずにレイアウトを並べ替えることができます。 アプリケーションでは、キーボード レイアウトを読み込むときに常に KLF_SUBSTITUTE_OK 値を使用して、ユーザーの設定 (ある場合) が選択されていることを確認する必要があります。

多言語サポートのために、 LoadKeyboardLayout 関数は KLF_REPLACELANG フラグと KLF_NOTELLSHELL フラグを提供します。 KLF_REPLACELANG フラグは、言語を変更せずに既存のキーボード レイアウトを置き換えるよう関数に指示します。 同じ言語識別子を使用し、 KLF_REPLACELANG を指定せずに既存のレイアウトを置き換えようとすると、エラーになります。 KLF_NOTELLSHELL フラグを使用すると、キーボード レイアウトが追加または置き換えられたときに、関数がシェルに通知できなくなります。 これは、連続する一連の呼び出しで複数のレイアウトを追加するアプリケーションに役立ちます。 このフラグは、最後の呼び出し以外のすべての呼び出しで使用する必要があります。

UnloadKeyboardLayout 関数は、システムの既定の入力言語をアンロードできないという点で制限されています。 これにより、シェルおよびファイル システムで使用されるのと同じ文字セットを使用して、テキストを入力するためのレイアウトが常に 1 つ用意されます。