Microsoft DirectX 8.0 (C++)

フォーカス キャプチャの実装

Microsoft® DirectPlay® Voice をサポートするロビー可能ゲーム アプリケーションとロビー アプリケーションを作成するには、フォーカスをキャプチャするという概念が不可欠である。ゲーム アプリケーションがフォーカス キャプチャを適切に実装していない場合、ロビー アプリケーションから起動したときに、音声通信が機能しない可能性がある。

DirectPlay 音声セッションの作成前に、以下のようにいくつかの初期化作業が完了していなければならない。

// DirectPlay 音声クライアントのインターフェイスを作成する。
hr = CoCreateInstance( CLSID_DirectPlayVoiceClient,
                       NULL, 
                       CLSCTX_INPROC_SERVER,
                       IID_IDirectPlayVoiceClient, 
                       (LPVOID*) &m_pVoiceClient )

// hwndAppWindow メンバを、ゲーム アプリケーション実行中に
// フォーカスのあるウィンドウに設定する。
DVSOUNDDEVICECONFIG dvSoundDeviceConfig;

dvSoundDeviceConfig.hwndAppWindow = hWnd;
// dwFlags を DVSOUNDCONFIG_STRICTFOCUS に設定する。こうすると、
// フォアグラウンドのアプリケーション ウィンドウだけがフォーカスを取得する。
dvSoundDeviceConfig.dwFlags = DVSOUNDCONFIG_STRICTFOCUS;

// 音声セッションに接続する。
hr = m_pVoiceClient->Connect( &dvSoundDeviceConfig, 
                              pdvClientConfig, 
                              DVFLAGS_SYNC )

アプリケーションがセッションに接続されると、DirectPlay 音声コールバックにメッセージが届く。フォーカス キャプチャを適切に実装するためには、DVMSGID_GAINFOCUSDVMSGID_LOSTFOCUS の 2 つのメッセージを処理する必要がある。

HRESULT CALLBACK DirectPlayVoiceClientMessageHandler(
                     LPVOID lpvUserContext,
                     DWORD dwMessageType,
                     LPVOID lpMessage )
{
    switch( dwMessageType )
    {
     case DVMSGID_GAINFOCUS:
        // ゲーム アプリケーションがシステム内のフォーカスを取得した。
            break;
        case DVMSGID_LOSTFOCUS:
        // ゲーム アプリケーションがシステム内のフォーカスを失った。
            break;
    }
  ...
}

録音がミュートされると、フォーカスが失われる。DirectPlay Voice からコールバックに DVMSGID_LOSTFOCUS メッセージが届く。録音のミュートが解除されると、フォーカスが戻る。ただし、DVSOUNDCONFIG_STRICTFOCUS を使っているアプリケーションでは、アプリケーション ウィンドウがフォアグラウンドである場合にのみ、フォーカスが戻る。

DVCLIENTCONFIG dvClientConfig;
dvClientConfig.dwFlags = DVCLIENTCONFIG_RECORDMUTE;

// 録音をミュートする。DVMSGID_LOSTFOCUS が DirectPlay 音声コールバック関数
// に送信される。
m_pVoiceClient->SetClientConfig(dvClientConfig);