Microsoft DirectX 8.0 (C++)

IDirectInputDevice8::SetEventNotification

デバイス状態が変化したときに設定されるイベントを指定する。イベント通知をオフにするためにも使われる。

HRESULT SetEventNotification(
  HANDLE hEvent  
);

パラメータ

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

アプリケーションは、Microsoft® 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 以降に対する再配布可能ファイルとして提供。
  ヘッダー : dinput.h で宣言。

参照

ポーリングとイベント通知