次の方法で共有


キーボード アクセラレータについて

アクセラレータはメニューと密接に関連しており、どちらもユーザーにアプリケーションのコマンド セットへのアクセスを提供します。 通常、ユーザーはアプリケーションのメニューに依存してコマンド セットを学習し、アプリケーションに習熟するにつれてアクセラレータの使用に切り替えます。 アクセラレータを使用すると、メニューよりも高速でコマンドに直接アクセスできます。 少なくとも、アプリケーションは、より一般的に使用されるコマンドのアクセラレータを提供する必要があります。 通常、アクセラレータはメニュー項目として存在するコマンドを生成しますが、同等のメニュー項目がないコマンドを生成することもできます。

このセクションでは、次のトピックについて説明します。

アクセラレータ テーブル

アクセラレータ テーブルは ACCEL 構造体の配列で構成され、それぞれが個々のアクセラレータを定義します。 各 ACCEL 構造体には、次の情報が含まれます。

  • アクセラレータのキーストロークの組み合わせ。
  • アクセラレータの識別子。
  • さまざまなフラグ。 これには、アクセラレータの使用時に対応するメニュー項目 (存在する場合) を強調表示して、システムが視覚的なフィードバックを提供するかどうかを指定するものが含まれます。

指定したスレッドのアクセラレータ キーストロークを処理するには、開発者はスレッドのメッセージ キューに関連付けられているメッセージ ループで TranslateAccelerator 関数を呼び出す必要があります。 TranslateAccelerator 関数は、メッセージ キューへのキーボード入力を監視し、アクセラレータ テーブルのエントリと一致するキーの組み合わせを確認します。 TranslateAccelerator は、一致するものを見つけると、キーボード入力 (つまり、WM_KEYUPメッセージとWM_KEYDOWN メッセージ) をWM_COMMANDメッセージまたはWM_SYSCOMMAND メッセージに変換し、指定したウィンドウのウィンドウ プロシージャにメッセージを送信します。 次の図は、アクセラレータの処理方法を示しています。

キーボード アクセラレータ処理モデル

WM_COMMAND メッセージには、TranslateAccelerator がメッセージを生成する原因となったアクセラレータの識別子が含まれています。 ウィンドウ プロシージャは、識別子を調べてメッセージのソースを特定し、それに応じてメッセージを処理します。

アクセラレータ テーブルは、2 つの異なるレベルに存在します。 システムは、すべてのアプリケーションに適用される単一のシステム全体のアクセラレータ テーブルを保持します。 アプリケーションはシステム アクセラレータ テーブルを変更できません。 システム アクセラレータ テーブルによって提供されるアクセラレータの詳細については、「 Accelerator のキーストロークの割り当て」を参照してください。

システムでは、アプリケーションごとにアクセラレータ テーブルも保持されます。 アプリケーションは、独自のウィンドウで使用する任意の数のアクセラレータ テーブルを定義できます。 一意の 32 ビット ハンドル (HACCEL) は、各テーブルを識別します。 ただし、指定したスレッドに対して一度にアクティブにできるアクセラレータ テーブルは 1 つだけです。 TranslateAccelerator 関数に渡されるアクセラレータ テーブルへのハンドルによって、スレッドに対してアクティブになっているアクセラレータ テーブルが決まります。 アクティブなアクセラレータ テーブルは、別のアクセラレータ テーブル ハンドルを TranslateAccelerator に渡すことによって、いつでも変更できます。

Accelerator-Tableの作成

アプリケーションのアクセラレータ テーブルを作成するには、いくつかの手順が必要です。 最初に、リソース コンパイラを使用してアクセラレータ テーブル リソースを作成し、アプリケーションの実行可能ファイルに追加します。 実行時には、 LoadAccelerators 関数を使用して、アクセラレータ テーブルをメモリに読み込み、アクセラレータ テーブルへのハンドルを取得します。 このハンドルは、アクセラレータ テーブルをアクティブ化するために TranslateAccelerator 関数に渡されます。

また、 ACCEL 構造体の配列を CreateAcceleratorTable 関数に渡すことで、実行時にアプリケーションのアクセラレータ テーブルを作成することもできます。 このメソッドは、アプリケーションでユーザー定義アクセラレータをサポートします。 LoadAccelerators 関数と同様に、CreateAcceleratorTable は、アクセラレータ テーブルをアクティブ化するために TranslateAccelerator に渡すことができるアクセラレータ テーブル ハンドルを返します。

システムは、 LoadAccelerators によって読み込まれたアクセラレータ テーブル、または CreateAcceleratorTable によって作成されたアクセラレータ テーブルを自動的に破棄します。 ただし、アプリケーションは、 DestroyAcceleratorTable 関数を呼び出すことによって必要なくなったアクセラレータ テーブルを破棄することで、実行中にリソースを解放できます。

既存のアクセラレータ テーブルをコピーおよび変更できます。 既存のアクセラレータ テーブルは、 CopyAcceleratorTable 関数を使用してコピーされます。 コピーが変更されると、 CreateAcceleratorTable を呼び出すことによって、新しいアクセラレータ テーブルへのハンドルが取得されます。 最後に、ハンドルが TranslateAccelerator に渡され、新しいテーブルがアクティブになります。

アクセラレータのキーストロークの割り当て

アクセラレータの定義には、ASCII 文字コードまたは仮想キー コードを使用できます。 ASCII 文字コードを使用すると、アクセラレータでは大文字と小文字が区別されます。 したがって、ASCII "C" 文字を使用すると、アクセラレータは Alt + c ではなく Alt + C として定義されます。 ただし、大文字と小文字を区別するアクセラレータを使用すると、混乱を招く可能性があります。 たとえば、CAPS LOCK キーがダウンしている場合、または Shift キーがダウンしている場合は Alt + C アクセラレータが生成されますが、両方がダウンしている場合は生成されません。

通常、アクセラレータでは大文字と小文字を区別する必要がないため、ほとんどのアプリケーションでは ASCII 文字コードではなく、アクセラレータに仮想キー コードを使用します。

アクセラレータはニーモニックをオーバーライドし、ユーザーを混乱させる可能性があるため、アプリケーションのメニュー ニーモニックと競合するアクセラレータを避けます。 メニュー ニーモニックの詳細については、「 メニュー」を参照してください。

アプリケーションがシステム アクセラレータ テーブルでも定義されているアクセラレータを定義する場合、アプリケーション定義アクセラレータはシステム アクセラレータをオーバーライドしますが、アプリケーションのコンテキスト内でのみオーバーライドします。 ただし、システム アクセラレータがユーザー インターフェイスで標準ロールを実行できなくなるため、この方法は避けてください。 システム全体のアクセラレータについては、次の一覧で説明します。

アクセラレータ Description
Alt + Esc 次のアプリケーションに切り替えます。
Alt + F4 アプリケーションまたはウィンドウを閉じます。
Alt + ハイフン ドキュメント ウィンドウの [ウィンドウ ] メニューを開きます。
Alt + 印刷画面 作業中のウィンドウ内の画像をクリップボードにコピーします。
Alt + Space アプリケーションのメイン ウィンドウの [ウィンドウ] メニューを開きます。
Alt + Tab 次のアプリケーションに切り替えます。
Ctrl + Esc [スタート] メニューに切り替えます。
Ctrl + F4 アクティブなグループまたはドキュメント ウィンドウを閉じます。
F1 アプリケーションのヘルプ ファイルが存在する場合は起動します。
Print Screen 画面上の画像をクリップボードにコピーします。
Shift + Alt + Tab 前のアプリケーションに切り替えます。 ユーザーは、Tab キーを押しながら Alt キーを押しながら Shift キーを押す必要があります。

 

アクセラレータとメニュー

アクセラレータの使用は、メニュー項目の選択と同じです。どちらのアクションでも、システムは WM_COMMAND または WM_SYSCOMMAND メッセージを対応するウィンドウ プロシージャに送信します。 WM_COMMAND メッセージには、ウィンドウ プロシージャがメッセージのソースを確認するために調べる識別子が含まれています。 アクセラレータが WM_COMMAND メッセージを生成した場合、識別子はアクセラレータの識別子です。 同様に、メニュー項目が WM_COMMAND メッセージを生成した場合、識別子はメニュー項目の識別子になります。 アクセラレータにはメニューからコマンドを選択するためのショートカットが用意されているため、通常、アプリケーションは同じ識別子をアクセラレータと対応するメニュー項目に割り当てます。

アプリケーションは、対応するメニュー項目 WM_COMMAND メッセージとまったく同じ方法で、アクセラレータ WM_COMMAND メッセージを 処理します。 ただし、アクセラレータを対応するメニュー項目とは異なる方法で処理する必要がある場合に備え、 WM_COMMAND メッセージには、アクセラレータまたはメニュー項目からメッセージが送信されたかどうかを指定するフラグが含まれています。 WM_SYSCOMMAND メッセージには、このフラグは含まれていません。

識別子は、アクセラレータが WM_COMMAND または WM_SYSCOMMAND メッセージを生成するかどうかを決定します。 識別子の値が [システム] メニューのメニュー項目と同じ場合、アクセラレータは WM_SYSCOMMAND メッセージを生成します。 それ以外の場合、アクセラレータは WM_COMMAND メッセージを生成します。

アクセラレータにメニュー項目と同じ識別子があり、メニュー項目が灰色または無効になっている場合、アクセラレータは無効になり、 WM_COMMAND または WM_SYSCOMMAND メッセージは生成されません。 また、対応するウィンドウが最小化されている場合、アクセラレータはコマンド メッセージを生成しません。

ユーザーがメニュー項目に対応するアクセラレータを使用すると、ウィンドウ プロシージャは、ユーザーがメニュー項目を選択したかのように WM_INITMENUWM_INITMENUPOPUP メッセージを受け取ります。 これらのメッセージを処理する方法については、「 メニュー」を参照してください。

メニュー項目に対応するアクセラレータは、メニュー項目のテキストに含める必要があります。

UI の状態

Windows を使用すると、アプリケーションは UI のさまざまな機能を非表示または表示できます。 これらの設定は UI 状態と呼ばれます。 UI の状態には、次の設定が含まれます。

  • フォーカス インジケーター (ボタンのフォーカス四角形など)
  • キーボード アクセラレータ (コントロール ラベルの下線で示されます)

ウィンドウは、メッセージを送信して UI 状態の変更を要求したり、UI 状態を照会したり、子ウィンドウに特定の状態を適用したりできます。 これらのメッセージは次のとおりです。

Message 説明
WM_CHANGEUISTATE UI の状態を変更する必要があることを示します。
WM_QUERYUISTATE ウィンドウの UI 状態を取得します。
WM_UPDATEUISTATE UI の状態を変更します。

 

既定では、最上位ウィンドウのすべての子ウィンドウは、親と同じ UI 状態で作成されます。

システムは、ダイアログ ボックス内のコントロールの UI 状態を処理します。 ダイアログ ボックスの作成時に、システムはそれに応じて UI 状態を初期化します。 すべての子コントロールはこの状態を継承します。 ダイアログ ボックスが作成されると、システムはユーザーのキーストロークを監視します。 UI 状態の設定が非表示で、ユーザーがキーボードを使用して移動すると、システムによって UI 状態が更新されます。 たとえば、ユーザーが Tab キーを押してフォーカスを次のコントロールに移動すると、フォーカス インジケーターが表示されるように WM_CHANGEUISTATE が呼び出されます。 ユーザーが Alt キーを押すと、システムは WM_CHANGEUISTATE を呼び出してキーボード アクセラレータを表示します。

コントロールが含まれている UI 要素間のナビゲーションをサポートしている場合は、独自の UI 状態を更新できます。 コントロールは 、WM_QUERYUISTATE を呼び出して、UI の初期状態を取得してキャッシュできます。 コントロールは、 WM_UPDATEUISTATE メッセージを受信するたびに、UI の状態を更新し、 WM_CHANGEUISTATE メッセージを親に送信できます。 各ウィンドウは、最上位のウィンドウに到達するまで、メッセージを親に送信し続けます。 最上位ウィンドウは、ウィンドウ ツリー内のウィンドウに WM_UPDATEUISTATE メッセージを送信します。 ウィンドウがWM_CHANGEUISTATE メッセージを渡さない場合、ウィンドウは最上位ウィンドウに到達せず、UI の状態は更新されません。