Platform SDK: DirectX |
デバイスの協調レベルは、アプリケーション間および Windows システムでデバイスを共有する方法を定義する。以下の例のように、協調レベルを設定するには IDirectInputDevice7::SetCooperativeLevel メソッドを使用する。
/* hwnd は、最上位ウィンドウのハンドルである。*/ lpdiDevice->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)
パラメータは、そのデバイスに関連付けられた最上位ウィンドウ (一般的には、アプリケーション ウィンドウ) のハンドルと、1 つまたは複数のフラグである。
デバイスの協調レベルは、アプリケーション間および Windows システムでデバイスを共有する方法を定義する。以下の例のように、協調レベルを設定するには DirectInputDevice.SetCooperativeLevel メソッドを使用する。
diDevice.SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE Or DISCL_FOREGROUND)
パラメータは、デバイスに関連する最上位ウィンドウ (一般的には、アプリケーション ウィンドウ) のハンドルと、1 つまたは複数のフラグである。フォームの hWnd プロパティは、そのフォームが表示されるまで有効にならない。アプリケーションのメイン フォームの Load メソッドで DirectInput デバイスを初期化している場合、協調レベルを設定する前に、Show メソッドを呼び出す必要がある。
注 : DirectInput にはデフォルト設定が用意されているが、協調レベルは、明示的に設定しなければならない。これは、DirectInput にウィンドウのハンドルを与えるための唯一の方法だからである。このハンドルがないと、DirectInput は、ジョイスティックの再キャリブレーションなど、ウィンドウ メッセージが必要な状況で反応することができなくなる。
有効なフラグの組み合わせを以下の表に示す。
フラグ | メモ |
---|---|
DISCL_NONEXCLUSIVE DISCL_BACKGROUND |
デフォルト設定 |
DISCL_NONEXCLUSIVE DISCL_FOREGROUND |
|
DISCL_EXCLUSIVE DISCL_FOREGROUND |
|
DISCL_EXCLUSIVE DISCL_BACKGROUND |
キーボードまたはマウスには無効 |
キーボードの場合は、DISCL_NOWINKEY と DISCL_NONEXCLUSIVE を同時に使用することもできる。このフラグで Windows キーを無効にすることにより、ユーザーは不注意でアプリケーションを終了することがなくなる。排他モードでは、Windows キーは常に無効である。
協調レベルには 2 つの構成要素がある。デバイスをフォアグラウンドまたはバックグラウンドで使用するか、および排他または非排他に使用するかである。
フォアグラウンド協調レベルは、アプリケーションがフォアグラウンドにある場合、すなわち、入力フォーカスを持つ場合に限り、入力デバイスが使用可能になることを意味する。アプリケーションがバックグラウンドに移ると、入力デバイスは自動的に解放されるか使用不可になる。
バックグラウンド協調レベルとは、実際には「フォアグラウンドとバックグラウンド」のことである。バックグラウンド協調レベルのデバイスは、アプリケーションからいつでも取得して使用できる。
通常は、フォアグラウンド アクセス権だけで十分なはずである。というのも、大半のアプリケーションにとって、ほかのプログラムがフォアグラウンドにある場合に発生する入力は重要でないからである。
アプリケーションの開発中に、条件付きコンパイルを使って、デバッグ用にバックグラウンド協調レベルを設定することは有用である。これにより、アプリケーションは、デバッグ環境への切り替えでバックグラウンドに移動するたびに、デバイスへのアクセスを失うことがなくなる。
あるアプリケーションがデバイスを排他レベルで使用しているからといって、ほかのアプリケーションが同じデバイスからデータを取得できないということにはならない。「排他レベルで使用」とは、ほかのアプリケーションが同じデバイスを排他には取得できないということを意味する。
たとえばあるミュージック プレーヤー アプリケーションの場合、アプリケーションはバックグラウンドにあっても、ハンドヘルドのリモート コントロール デバイスから入力を受け付ける。ここで、同じリモート コントロール デバイスからの信号に応答して、映画を再生するアプリケーションを実行するとしよう。ユーザーが [Play] を押したら何が起こるだろうか。両方のプログラムが再生を開始することになる。このような結果をユーザーが望んでいるとは思えない。そうならないようにするには、各アプリケーションに DISCL_EXCLUSIVE フラグを設定し、一度にどちらかのプログラムしか実行できないようにする必要がある。
フォース フィードバック エフェクトを利用するには、アプリケーションはデバイスへの排他アクセスができなければならない。
Windows 自体には、マウスへの排他アクセスが必要である。なぜなら、アクティブでないウィンドウ上でのクリックなどのマウス イベントを使って、アプリケーションにデバイスを強制解放させることが可能であり、そのことが、入力バッファからのデータの喪失など、潜在的に有害な結果を生む可能性があるからである。このため、あるアプリケーションがマウスに対する排他アクセス権を持っていると、Windows には一切のアクセスが許されない。マウス メッセージは生成されない。さらなる副作用として、カーソルが消えることもある。
あるアプリケーションがキーボードに対する排他アクセス権を持っている場合、DirectInput は一切のキーボード メッセージを抑制する。ただし、Ctrl+Alt+Del キーおよび Windows 95 や Windows 98 での Alt+Tab キーは使用できる。