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