次の方法で共有


デバイスの取得

デバイスの取得

Microsoft® DirectInput® デバイスの取得とは、デバイスへのアクセスをアプリケーションに与えることである。デバイスが取得されている限り、DirectInput は、アプリケーションがデバイスのデータを使えるようにする。デバイスが取得されていない場合、デバイスの特性に対する操作はできるが、データは取得できない。

取得は永続するものではない。アプリケーションは、デバイスを何回でも取得・解放できる。

協調レベルによっては、アプリケーションがバックグラウンドに移行すると、自動的にデバイスが解放されることがある。マウスの場合、ユーザーがメニューをクリックすると自動的に解放される。クリックした時点で Microsoft Windows® がデバイスの制御を引き継ぐからである。

デバイス プロパティを変更する前には、そのデバイスを解放しなければならない。唯一の例外として、フォース フィードバック デバイスは、取得状態にあってもゲインを変更できる。

取得のメカニズムが必要な理由は、次の 2 つである。

最初の理由は、DirectInput は、デバイスからのデータの流れがシステムにより中断されたときに、アプリケーションに通知できなければならないことである。たとえば、ユーザーが Alt+Tab キーを使って別のアプリケーションに切り替え、切り替え後のアプリケーションで入力デバイスを使った場合、元のアプリケーションは、入力デバイスが自身に属さず、バッファ状態が変化した可能性があることを知る必要がある。DISCL_FOREGROUND 協調レベルでのアプリケーションを考慮してみる。ユーザーが Shift キーを押しながら別のアプリケーションに切り替える。その後、ユーザーは Shift キーを離し、元のアプリケーションに戻る。元のアプリケーションからみれば、Shift キーは依然として押されている状態である。取得のメカニズムでは、元のアプリケーションに入力が終了したことを通知して、この状態から回復させられる。

もう 1 つの理由は、アプリケーションがデバイスのプロパティを変更できるので、保護がなければユーザーがデータを取得しようとするたびに、DirectInput がプロパティをチェックしなければならなくなることである。これでは、非常に効率が悪い。さらに悪いことには、バッファ サイズを変更している最中に、データ バッファにアクセスするハードウェア割り込みが発生するなど、大きな障害が起きる可能性がある。そうした理由で、DirectInput は、プロパティを変更する前に、アプリケーションに対してデバイスを解放するように要求する。デバイスを再取得すると、DirectInput はプロパティを確認して、デバイスからアプリケーションへの最適なデータ転送の方法を決定する。この処理は 1 回しか行われないので、データ取得の各メソッドを非常に高速にすることができる。

デバイスを失う最もよくある原因は、アプリケーションがバックグラウンドに移行することである。したがって、アプリケーションがアクティブになったときには、常にデバイスを再取得する必要がある。しかし、起動時の WM_ACTIVATE ハンドラに依存するには注意が必要である。最初の WM_ACTIVATE メッセージが到着するのは、ウィンドウの初期化中で、DirectInput のセットアップ前であることが多い。起動時にデバイスを確実に取得するには、デバイスが初期化されたらすぐに IDirectInputDevice8::Acquire を呼び出すようにする。

特に標準のキーボードやマウス以外のデバイスの場合、プログラム ウィンドウがアクティブになったときにデバイスを取得しても、デバイスが解放されるすべてのケースに対応できるとは限らない。アプリケーションがデバイスを不意に解放する場合もあるので、デバイスからデータを取得しようとする前に、取得状態を確認するメカニズムが必要である。Scrawl サンプルでは、Scrawl_OnMouseInput 関数でこの確認を行っている。この関数では、DIERR_INPUTLOST エラーが、マウスを再取得するメッセージのトリガになる。詳細については、「チュートリアル 2 : マウスの使い方」を参照すること。

取得済みのデバイスを再取得しようとしてもかまわない。IDirectInputDevice8::Acquire に対する冗長な呼び出しは無視され、デバイスは常に IDirectInputDevice8::Unacquire を 1 回呼び出すことで解放できる。

Windows は、アプリケーションがマウスを排他モードで使っているときは、マウスにアクセスしない。Windows にマウスを取得させたい場合ば、マウスを解放しなければならない。Scrawl サンプルでは、右ボタンのクリックに反応するために、マウスを解放し、Windows カーソルを同じ点に表示し、ショートカット メニューを表示し、メニュー選択が行われるまで Windows が入力を処理するようにしている。