Platform SDK: DirectX

IDirectInputDevice7::SetEventNotification

IDirectInputDevice7::SetEventNotification メソッドは、イベント通知ステータスを設定する。このメソッドは、デバイス状態が変化したときに設定されるイベントを指定する。イベント通知をオフにするためにも使われる。

HRESULT SetEventNotification(
  HANDLE hEvent  
);

パラメータ

hEvent
デバイス状態が変化したときに設定されるイベントのハンドル。DirectInput はデバイスの状態が変化したときに、このハンドルに対して Win32 SetEvent 関数を使用する。hEvent パラメータを NULL にすると、通知は無効になる。

アプリケーションは、Win32 CreateEvent 関数を使用して、手動リセット イベントまたは自動リセット イベントとしてハンドルを作成することができる。イベントを自動リセット イベントとして作成すると、オペレーティング システムは、待ち時間が経過したときに自動的にイベントをリセットする。イベントを手動リセット イベントとして作成すると、アプリケーションは、Win32 ResetEvent 関数を呼び出してイベントをリセットしなければならない。DirectInput は、イベント通知ハンドルに対して、Win32 ResetEvent 関数を呼び出さない。アプリケーションは、通常、イベントを自動リセット イベントとして作成する。

戻り値

成功すれば DI_POLLEDDEVICE

失敗すれば次のエラー値のいずれかを返す。

DIERR_ACQUIRED
DIERR_HANDLEEXISTS
DIERR_INVALIDPARAM
DIERR_NOTINITIALIZED

注意

デバイス状態の変更は次のいずれかに定義される。

DirectInputDevice オブジェクト中に選択されているイベントに対しては、Win32 CloseHandle 関数を呼び出してはならない。イベント ハンドルを終了する前に、hEvent パラメータに NULL を設定して、このメソッドを呼び出さなければならない。

イベント通知ハンドルは、デバイスが取得されている間は変更できない。この関数が成功すれば、アプリケーションは、ほかの Win32 イベント ハンドルと同様に、このイベント ハンドルを使用できる。

以下の例は、ハンドルが現在ブロッキングなしに設定されているかどうかをチェックする。

dwResult = WaitForSingleObject(hEvent, 0);
if (dwResult == WAIT_OBJECT_0) {
// イベントを設定する。イベントが自動リセットで
// 作成されていた場合は、同時にリセットされる。
} 

次の例は、イベントが設定されるまで、繰り返しブロッキングを行う処理を示している。待ち時間が経過するまで、スレッドはシステムに応答できないので、この動作は厳禁である。特に、スレッドは Windows メッセージに応答しなくなる。

dwResult = WaitForSingleObject(hEvent, INFINITE);
if (dwResult == WAIT_OBJECT_0) {
// イベントが設定された。イベントが自動リセットで
// 作成されていた場合は、同時にリセットされる。
} 

以下の例は、2 つのイベントを使用するメッセージベースのアプリケーションの、典型的なメッセージ ループを示している。

HANDLE ah[2] = { hEvent1, hEvent2 };
 
while (TRUE) {
 
dwResult = MsgWaitForMultipleObjects(2, ah, FALSE,
INFINITE, QS_ALLINPUT);
switch (dwResult) {
case WAIT_OBJECT_0: 
// イベント 1 が設定された。イベントが自動リセットで
// 作成されていた場合は、同時にリセットされる。
ProcessInputEvent1();
break;
 
case WAIT_OBJECT_0 +1: 
// イベント 2 が設定された。イベントが自動リセットで
// 作成されていた場合は、同時にリセットされる。
ProcessInputEvent2();
break;
 
case WAIT_OBJECT_0 + 2: 
// Windows メッセージを受け取った。
// メッセージがなくなるまで処理を続ける。
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if (msg.message == WM_QUIT) {
goto exitapp;
            } 
TranslateMessage(&msg);
DispatchMessage(&msg);
        } 
break;
 
default: 
// 予期しないエラー。
Panic();
break;
    } 
} 

次の例は、2 つのイベントを使用する非メッセージベースのアプリケーションの、典型的なメッセージ ループを示している。

HANDLE ah[2] = { hEvent1, hEvent2 };
DWORD dwWait = 0;
 
while (TRUE) {
 
dwResult = MsgWaitForMultipleObjects(2, ah, FALSE,
dwWait, QS_ALLINPUT);
dwWait = 0;
 
switch (dwResult) {
case WAIT_OBJECT_0: 
// イベント 1 が設定された。イベントが自動リセットで
// 作成されていた場合は、同時に
// リセットされる。
ProcessInputEvent1();
break;
 
case WAIT_OBJECT_0 +1: 
// イベント 2 が設定された。イベントが自動リセットで
// 作成されていた場合は、同時に
// リセットされる。
ProcessInputEvent2();
break;
 
case WAIT_OBJECT_0 + 2: 
// Windows メッセージを受け取った。
// メッセージがなくなるまで処理を続ける。
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if (msg.message == WM_QUIT) {
goto exitapp;
            } 
TranslateMessage(&msg);
DispatchMessage(&msg);
        } 
break;
 
default: 
// 入力あるいは待機中のメッセージがない。
// ゲームのフレームを作る。
// ゲームがアイドル状態であれば、
// 入力あるいはメッセージを待ち続ける。
if (!DoGame()) {
dwWait = INFINITE;
        } 
break;
    } 
} 

動作環境

  Windows NT/2000 :Windows 2000 が必要。
  Windows 95/98 : Windows 95 以降が必要。Windows 95 用に再配布可能な形で使用可能。
  ヘッダー : dinput.h で宣言。
  インポート ライブラリ : dinput.lib を使用。

参照

ポーリングとイベント