協調レベル

デバイスの協調レベルは、他のアプリケーションや Windows システムと入力を共有する方法を決定します。協調レベルは、IDirectInputDevice8::SetCooperativeLevel メソッドを使用して設定します。

/* hwnd is the top-level window handle. */      
lpdiDevice->SetCooperativeLevel(hwnd,
        DISCL_NONEXCLUSIVE | DISCL_FOREGROUND) 

パラメーターは、デバイスに関連付けられた最上位ウィンドウ (一般的にはアプリケーション ウィンドウ) へのハンドルと、1 つ以上のフラグです。

Flags 備考
DISCL_NONEXCLUSIVE

DISCL_BACKGROUND

既定の設定
DISCL_NONEXCLUSIVE

DISCL_FOREGROUND

DISCL_EXCLUSIVE

DISCL_FOREGROUND

DISCL_EXCLUSIVE

DISCL_BACKGROUND

キーボードまたはマウスでは無効

キーボードの場合は、DISCL_NONEXCLUSIVE と組み合わせて DISCL_NOWINKEY も指定できます。このフラグは Windows ロゴ キーを無効にして、ユーザーが不注意にアプリケーションを終了することのないようにします。排他モードでは、Windows ロゴ キーは常に無効です。

    Windows ロゴ キーは、アプリケーションの協調レベルで排他強調レベルが指定されて受動的に無効になっている場合や、DISCL_NOWINKEY フラグが使用されて能動的に無効にされている場合であっても、既定のアクション マッピング UI が表示されている間はアクティブになります。

協調レベルには、2 つの主要コンポーネントがあります。1 つはデバイスがフォアグラウンドとバックグラウンドのどちらで使用されているかであり、もう 1 つはデバイスが排他と非排他のどちらで使用されているかです。

フォアグラウンドとバックグラウンド

排他と非排他

アプリケーションがバックグラウンドで実行されているときでも、ハンドヘルドのリモート コントロール デバイスからの入力を受け付けるミュージック プレーヤーの例を考えます。ここで、同じリモート コントロールからの信号に反応して映画を再生する同様のアプリケーションを実行するとします。再生ボタンを押すと、どうなるでしょうか。どちらのプログラムも再生を始めますが、これはユーザーが望む動作ではありません。このようなことが起きないようにするには、各アプリケーションに DISCL_EXCLUSIVE フラグを設定し、一時点で実行できるのはどちらか一方のみになるようにする必要があります。

フォース フィードバック エフェクトを使用するには、アプリケーションはデバイスに排他的アクセス権を持つ必要があります。

Windows 自体は、システム マウスへの排他的アクセス権を要求します。これは、非アクティブ ウィンドウでのクリックなどのシステム マウス イベントにより、アプリケーションが強制的にデバイスを放棄しなければならなくなり、入力バッファーからのデータ喪失などの有害な結果を招くおそれがあるためです。このため、IDirectInput8::CreateDevice に GUID_SysMouse を渡すことによって作成されたシステム マウスに対してアプリケーションが排他的アクセス権を持つときには、Windows はアクセスを許可されず、マウス メッセージは生成されません。さらに、カーソルが消えるという副作用があります。