キーボードとマウスのカスタマイズ
更新 : 2007 年 11 月
Visual C++ 2008 Feature Pack では、キーボード入力とマウス入力をアプリケーションが処理する方法をユーザーがカスタマイズできます。キーボード入力のカスタマイズとして、コマンドにショートカット キーを割り当てることができます。また、マウス入力のカスタマイズとして、ユーザーがアプリケーションの特定のウィンドウ内をダブルクリックしたときに実行されるコマンドを選択できます。このトピックでは、アプリケーションでの入力をカスタマイズする方法について説明します。
ユーザーは、[Customization] ダイアログ ボックスでマウスやキーボードのカスタム コントロールを変更できます。このウィンドウを表示するには、[View] をクリックし、[Toolbars and Docking] メニューの [Customize] をクリックします。次に、[Keyboard] タブまたは [Mouse] タブをクリックします。
キーボードのカスタマイズ
次の図は、[Customization] ダイアログ ボックスの [Keyboard] タブを示しています。
キーボードのカスタマイズ タブ
ユーザーは、[Keyboard] タブを使用して、コマンドに 1 つまたは複数のショートカット キーを割り当てます。使用できるコマンドが、タブの左側に一覧表示されます。ユーザーは、メニューから使用できるコマンドを選択できます。ショートカット キーに関連付けることができるのはメニュー コマンドだけです。新しいショートカット キーを入力すると、[Assign] ボタンが有効になります。ユーザーがこのボタンをクリックすると、アプリケーションは選択されたコマンドをそのショートカット キーに関連付けます。
現在割り当てられているすべてのショートカット キーが、右側の列のリスト ボックスに表示されます。個々のショートカット キーを選択して削除したり、アプリケーションのすべての割り当てをリセットしたりすることもできます。
アプリケーションでこのカスタマイズをサポートするには、CKeyboardManager オブジェクトを作成する必要があります。CKeyboardManager オブジェクトを作成するには、CWinAppEx::InitKeyboardManager 関数を呼び出します。このメソッドは、キーボード マネージャを作成し、初期化します。キーボード マネージャを手動で作成する場合は、CWinAppEx::InitKeyboardManager を呼び出してキーボード マネージャを初期化する必要があります。
ウィザードを使用してアプリケーションを作成する場合は、ウィザードによってキーボード マネージャが初期化されます。アプリケーションがキーボード マネージャを初期化すると、フレームワークは [Keyboard] タブを [Customization] ダイアログ ボックスに追加します。
マウスのカスタマイズ
次の図は、[Customization] ダイアログ ボックスの [Mouse] タブを示しています。
マウスのカスタマイズ タブ
ユーザーは、このタブを使用して、マウスのダブルクリック アクションにメニュー コマンドを割り当てます。ウィンドウの左側からビューを選択し、右側のコントロールを使用してコマンドをダブルクリック アクションに関連付けます。ユーザーが [Close] をクリックすると、アプリケーションは、ユーザーがビューの任意の場所をダブルクリックするたびに、関連付けられたコマンドを実行します。
ウィザードを使用してアプリケーションを作成する場合、既定ではマウスのカスタマイズは有効になりません。有効にするには、次の手順を実行する必要があります。
CWinAppEx::InitMouseManager を呼び出して CMouseManager オブジェクトを初期化します。
CWinAppEx::GetMouseManager を使用してマウス マネージャへのポインタを取得します。
CMouseManager::AddView メソッドを使用してマウス マネージャにビューを追加します。この操作を、マウス マネージャに追加する各ビューに対して行います。
アプリケーションがマウス マネージャを初期化すると、フレームワークは [Mouse] タブを [Customize] ダイアログ ボックスに追加します。ビューを追加しない場合は、タブにアクセスすると、ハンドルされない例外が発生します。ビューの一覧を作成すると、ユーザーは [Mouse] タブを使用できるようになります。
新しいビューをマウス マネージャに追加するときに、ビューに一意の ID を割り当てます。ウィンドウのマウスのカスタマイズをサポートするには、WM_LBUTTONDBLCLICK メッセージを処理し、CWinAppEx::OnViewDoubleClick 関数を呼び出す必要があります。この関数を呼び出すときに、パラメータの 1 つとして、そのウィンドウの ID を指定します。ID 番号および ID 番号に関連付けられたオブジェクトの管理は、プログラマが行います。
セキュリティに関する注意事項
「ユーザー定義のツール」で説明されているように、ユーザーはユーザー定義のツール ID をダブルクリック イベントに関連付けることができます。ユーザーがビューをダブルクリックすると、アプリケーションは関連付けられた ID に一致するユーザー ツールを探します。一致するツールが見つかった場合、アプリケーションはそのツールを実行します。一致するツールが見つからない場合は、WM_COMMAND メッセージを ID と共にダブルクリックされたビューに送信します。
カスタマイズした設定はレジストリに格納されます。攻撃者はレジストリを編集することで、有効なユーザー ツール ID を任意のコマンドに置き換えることができます。ユーザーがビューをダブルクリックすると、ビューは攻撃者が仕掛けたコマンドを処理します。これにより、予期しない動作や危険性のある動作が発生する可能性があります。
さらに、この種の攻撃は、ユーザー インターフェイスの保護をバイパスできます。たとえば、アプリケーションで印刷機能が無効になっているとします。つまり、アプリケーションのユーザー インターフェイスでは、[Print] のメニューとボタンが使用できません。通常は、これでアプリケーションは印刷を実行できなくなります。ただし、攻撃者がレジストリを編集した場合は、使用できないユーザー インターフェイス要素がバイパスされて、ユーザーはビューをダブルクリックすることで印刷コマンドを直接送信できます。
この種の攻撃を防ぐには、アプリケーションのコマンド ハンドラに、実行前にコマンドが有効かどうかを検証するコードを追加します。アプリケーションへのコマンド送信の防止をユーザー インターフェイスに依存しないでください。
参照
概念
Visual C++ 2008 用の MFC Feature Pack