Microsoft DirectX 8.0 (C++) |
Microsoft® DirectInput® は、デバイスのアクセス権を管理するために、IDirectInputDevice8::Acquire および IDirectInputDevice8::Unacquire メソッドを提供する。アプリケーションは、まず Acquire メソッドを呼び出し、デバイスに対するアクセス権を取得しなければならない。次に、IDirectInputDevice8::GetDeviceState メソッドと IDirectInputDevice8::GetDeviceData メソッドを使用して、マウス情報を要求する。
ほとんどの場合、アプリケーションには取得された状態のデバイスがある。しかし、フォアグラウンド アクセスしか持たない場合は、アプリケーションがバックグラウンドに移行すると必ずマウスは解放される。フォーカスが戻った場合には、確実にデバイスを再取得する必要がある。これは、WM_ACTIVATE メッセージに反応することで行うことができる。
Scrawl では、アプリケーションがフォーカスを取得するのか、または失うのかに合わせて、グローバル変数の g_bActive を設定することで、このメッセージを処理している。次に、ヘルパー関数の SetAcquire を呼び出す。このヘルパー関数は、g_bActive が TRUE の場合にマウスを取得し、そうでない場合にはマウスを解放する。
case WM_ACTIVATE: if (WA_INACTIVE == wParam) g_bActive = FALSE; else g_bActive = TRUE; // アクティブ状態に基づいてマウスへの排他モード アクセスを設定する。 SetAcquire(); return 0;
排他モードでアクセスしている場合、アプリケーションはマウスを解放し、ユーザーと Microsoft Windows® との対話 (メニューやダイアログ ボックスへのアクセスなど) を可能にする必要がある。Scrawl では、Alt キーと Space キーを同時に押すことで、ユーザーがシステム メニューを開くことができる。
Scrawl のウィンドウ プロシージャは、WM_ENTERMENULOOP に対するハンドラを持っている。このハンドラは、グローバル変数 g_bActive に FALSE を設定して SetAcquire 関数を呼び出すことで応答する。このハンドラを使うと、Windows はマウスを保持し、独自のカーソルを表示することができる。
ユーザーがメニューの使用を終了すると、Windows はアプリケーションに WM_EXITSIZEMOVE メッセージを送る。この場合、Scrawl のウィンドウ プロセスは適切に g_bActive を設定し、SetAcquire を呼び出す。
また、Scrawl は、ショートカット メニューを開く右ボタン クリックに応答して、マウスを解放する。マウスは遅れて解放されるが、WM_ENTERMENULOOP ハンドラでは、メニューが表示される前に Windows カーソルの位置を設定できるように、最初にマウスを解放している。
最後に、Scrawl は、データの取得を試みて DIERR_INPUTLOST エラーが返されたら、マウスの再取得を試みる。これは、ほかの箇所では処理されない方法によってデバイスが解放された場合への備えである。たとえば、ユーザーが Ctrl + Alt + Del キーを押した場合などである。
まとめると、アプリケーションは、マウスからデータを取得する前に、マウスを取得する必要がある。マウスの取得は、アプリケーションに強制的にマウスのアクセス権を放棄させる事態が発生しない限り、一度だけ行えば済む。排他モードでは、Windows がマウスを必要とするときに、マウスの制御を放棄しなければならない。また、マウスのアクセス権を Windows またはその他のアプリケーションに譲った後、マウスに対するアクセス権が必要になった場合は、マウスを再取得しなければならない。
アプリケーションがマウスのアクセス権を管理したら、「ステップ 6 : マウスからのバッファリング データの取得」に進む。