次の方法で共有


IDirectInputDevice8::SetEventNotification

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

HRESULT 
SetEventNotification(
  HANDLE hEvent
);

パラメータ

  • hEvent
    デバイスの状態が変化したときに設定されるイベントのハンドル。デバイスの状態が変化したとき、DirectInput はこのハンドルに対して Microsoft Win32 SetEvent 関数を使用します。hEvent パラメーターが NULL の場合、通知は無効になります。 アプリケーションは、Win32 CreateEvent 関数を使用して、手動リセットまたは自動リセットのどちらかのイベントとしてハンドルを作成できます。イベントが自動リセット イベントとして作成されると、待ち時間が満了したときにオペレーティング システムがイベントを自動的にリセットします。イベントが手動リセット イベントとして作成されると、アプリケーション側で Win32 ResetEvent 関数を呼び出してイベントをリセットする必要があります。DirectInput はイベント通知ハンドルに対して Win32 ResetEvent 関数を呼び出しません。ほとんどのアプリケーションは、自動リセット イベントとしてイベントを作成します。

戻り値

メソッドが正常に実行された場合、戻り値は DI_OK または DI_POLLEDDEVICE です。メソッドが失敗した場合、戻り値は次のいずれかのエラー値です。DIERR_ACQUIRED、DIERR_HANDLEEXISTS、DIERR_INVALIDPARAM、DIERR_NOTINITIALIZED

解説 

デバイスの状態の変化は、次のいずれかとして定義されます。

  • 軸の位置の変化
  • ボタンの状態 (押下または解放) の変化
  • POV コントロールの方向の変化
  • 獲得の解除

◆次の文節に含まれる◇ イベントが選択されて DirectInputDevice オブジェクトに格納されている間、Win32 CloseHandle 関数をそのイベントに対して呼び出さないでください。イベント ハンドルを閉じる前に、hEvent パラメーターを NULL に設定してこのメソッドを呼び出す必要があります。

デバイスが獲得されている間、イベント通知ハンドルを変更することはできません。関数が正常に実行されると、アプリケーションは他の Win32 イベント ハンドルと同様にイベント ハンドルを使用できます。

次のコード例では、ハンドルがブロッキングを行わないように現在設定されているかどうかをチェックします。

dwResult = WaitForSingleObject(hEvent, 0); 
if (dwResult == WAIT_OBJECT_0) { 
    // Event is set. If the event was created as 
    // autoreset, it has also been reset. 
} 

次のコード例では、イベントが設定されるまで無期限にブロッキングを行う例を示します。待ち時間が満了するまでスレッドがシステムに応答しなくなるので、この動作は使用しないことを強くお勧めします。特に、スレッドが Microsoft Windows メッセージに応答しなくなります。

dwResult = WaitForSingleObject(hEvent, INFINITE); 
if (dwResult == WAIT_OBJECT_0) { 
    // Event has been set. If the event was created 
    // as autoreset, it has also been reset. 
}

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

HANDLE ah[2] = { hEvent1, hEvent2 }; 

while (TRUE) { 

    dwResult = MsgWaitForMultipleObjects(2, ah, FALSE, 
                        INFINITE, QS_ALLINPUT); 
    switch (dwResult) { 
    case WAIT_OBJECT_0: 
        // Event 1 has been set. If the event was created as
        // autoreset, it has also been reset. 
        ProcessInputEvent1(); 
        break; 

    case WAIT_OBJECT_0 + 1: 
        // Event 2 has been set. If the event was created as
        // autoreset, it has also been reset. 
        ProcessInputEvent2(); 
        break; 

    case WAIT_OBJECT_0 + 2: 
        // A Windows message has arrived. Process 
        // messages until there aren't any more. 
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ 
            if (msg.message == WM_QUIT) { 
                goto exitapp; 
            } 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
        break; 

    default: 
        // Unexpected error. 
        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: 
        // Event 1 has been set. If the event was 
        // created as autoreset, it has also 
        // been reset. 
        ProcessInputEvent1(); 
        break; 

    case WAIT_OBJECT_0 + 1: 
        // Event 2 has been set. If the event was 
        // created as autoreset, it has also 
        // been reset. 
        ProcessInputEvent2(); 
        break; 

    case WAIT_OBJECT_0 + 2: 
        // A Windows message has arrived. Process 
        // messages until there aren't any more. 
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ 
            if (msg.message == WM_QUIT) { 
                goto exitapp; 
            } 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
        break; 

    default: 
        // No input or messages waiting. 
        // Do a frame of the game. 
        // If the game is idle, tell the next wait 
        // to wait indefinitely for input or a message. 
        if (!DoGame()) { 
            dwWait = INFINITE; 
        } 
        break; 
    } 
} 

要件

ヘッダー: Dinput.h 宣言

関連項目

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