Platform SDK: DirectX |
ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectInput Visual Basic チュートリアル」を参照すること。
DirectInput は、デバイスのアクセス権を管理するために、IDirectInputDevice7::Acquire および IDirectInputDevice7::Unacquire メソッドを提供する。アプリケーションは、まず Acquire メソッドを呼び出し、デバイスに対するアクセス権を取得しなければならない。次に、IDirectInputDevice7::GetDeviceState メソッドと IDirectInputDevice7::GetDeviceData メソッドを使用して、マウス情報を要求する。
ほとんどの場合、アプリケーションはデバイスを取得する。しかし、フォアグラウンド アクセスしか持たない場合は、アプリケーションがバックグラウンドに移行すると必ずマウスは解放される。フォーカスが戻った場合には、確実にデバイスを再取得する必要がある。これは、WM_ACTIVATE メッセージに反応することで行うことができる。
Scrawl では、アプリケーションがフォーカスを取得するのか、あるいは失うのかに合わせて、グローバル変数の g_fActive を設定することで、このメッセージを処理している。次に、ヘルパー関数の Scrawl_SyncAcquire を呼び出す。このヘルパー関数は、g_fActive が TRUE の場合にマウスを取得し、そうでない場合にはマウスを解放する。
case WM_ACTIVATE: g_fActive = wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE; Scrawl_SyncAcquire(hwnd); break;
排他アクセス権を持っている場合、メニューやダイアログ ボックスにアクセスするなど、ユーザーが対話形式で Windows を操作できるように、アプリケーションはマウスを解放しなければならないことがある。Scrawl では、Alt キーとスペース キーを同時に押すことで、ユーザーがシステム メニューを開くことができる。
Scrawl のウィンドウ プロシージャは、WM_ENTERMENULOOP に対するハンドラを持っている。このハンドラは、グローバル変数 g_fActive に FALSE を設定し、Scrawl_SyncAcquire 関数を呼び出すことで応答する。このハンドラを使うと、Windows はマウスを保持し、独自のカーソルを表示することができる。
ユーザーがメニューの使用を終了すると、Windows はアプリケーションに WM_EXITMENULOOP メッセージを送る。この場合、Scrawl のウィンドウ処理により、アプリケーション定義メッセージの WM_SYNCACQUIRE がアプリケーション自体のメッセージ キューに送信される。このことにより、Scrawl_SyncAcquire 関数でマウスが再取得される前に、ほかの待機中のメッセージが処理される。
また、Scrawl は、コンテキスト メニューを開く右ボタン クリックに応答して、マウスを解放する。マウスは遅れて解放されるが、WM_ENTERMENULOOP ハンドラでは、メニューが表示される前に Windows カーソルの位置を設定できるように、最初にマウスを解放している。
最後に、Scrawl は、データの取得を試みて DIERR_INPUTLOST エラーが返されたら、マウスの再取得を試みる。これは、ほかの箇所では処理されない方法によってデバイスが解放された場合への備えである。たとえば、ユーザーが Ctrl+Alt+Del キーを押した場合などである。
まとめると、アプリケーションは、マウスからデータを取得する前に、マウスを取得する必要がある。マウスの取得は、アプリケーションに強制的にマウスのアクセス権を放棄させる事態が発生しない限り、一度だけ行えば済む。排他モードでは、Windows がマウスを必要とするときに、マウスの制御を放棄しなければならない。また、マウスのアクセス権を Windows またはその他のアプリケーションに譲った後、マウスに対するアクセス権が必要になった場合は、マウスを再取得しなければならない。