Platform SDK: DirectX |
ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「DirectInput C/C++ チュートリアル」を参照すること。
ScrawlB サンプルでは、排他フォアグラウンド協調レベルでマウスを使用する方法を示す。このレベルでは、マウスがアプリケーションに取得されている間、Windows はマウスを追跡しない。その場合、アプリケーションには主に、次の 3 つの重要な役割がある。
ScrawlB は、ユーザー定義の感度値により調整されたマウス移動の専用レコードを保持し、描画用カーソルとして機能するアイコンを表示することで、第 1 の役割を処理する。
ScrawlB は、アプリケーション ウィンドウがバックグラウンドに移行すると、必ずマウスは解放される。アプリケーションがフォアグラウンドに戻ると、アプリケーションは MouseMove イベント ハンドラの中で DirectInputDevice.Acquire を呼び出すことで、マウスを自動的に再取得する。このハンドラは、Windows がマウス メッセージをアプリケーションに送信するときに呼び出される。この処理は、システム カーソルがクライアント ウィンドウ上に移動するか、クライアント ウィンドウがシステム カーソルの下のフォーカスを取得すると、発生する。ScrawlB がマウスを再取得した後は、当然ながら Windows マウス メッセージは送信されないので、これ以降のマウス イベントに応答して Form_MouseMove メソッドが呼び出されることはない。
ユーザーがコンテキスト メニューを操作したり、またはウィンドウのサイズを変更するなど、ほかの目的のためにシステム カーソルを表示したりできるように、ユーザーがメニューを表示すると、ScrawlB は DirectInputDevice.Unacquire メソッドを呼び出す。メニューが閉じられると、Form_MouseMove が呼び出され、マウスが再取得される。ただし、ユーザーがメニューから [Suspend] を選択する場合を除く。この場合はフラグが設定される。このフラグは、Form_MouseMove によるマウスの再取得を妨害するので、ユーザーはシステム カーソルを引き続き使用できる。
サンプル アプリケーションでは、マウスを解放する複数の方法を示している。ユーザーが Alt キーを押しながらスペース キーを押して、システム メニューを表示する場合、Windows は WM_ENTERMENULOOP メッセージを送信する。このメッセージは、サブクラス化されたウィンドウ プロシージャによりインターセプトされるので、マウスは取得されない。メニューを操作するためやユーザーがウィンドウのサイズを変更するために Windows がシステム カーソルを使用している限り、Windows は frmCanvas に対してマウス メッセージを送信しない。したがって、アプリケーションは Form_MouseMove でマウスを再取得しようとはしない。WM_ACTIVATE や WM_ACTIVATEAPP など、ほかの Windows メッセージを傍受する際にも同様の方法が使用される。これによりアプリケーションは、フォーカスの取得と喪失に応答して、マウスの取得と解放を完全に制御できる。