2011-07-15 15 views
5

DirectSound APIを使用してオーディオデータをレンダリングするコンソールプログラムを作成しています。私は、DirectSound Programming Guide (from Microsoft)に従うときに不思議な問題に遭遇しました。 documentationによると:コンソールプログラムでDirectSound SetCooperativeLevelにHWNDを提供する方法は?

デバイスオブジェクトを作成した後、あなたはIDirectSound8::SetCooperativeLevelメソッドを使用して、デバイスのための協力レベルを設定する必要があります。これを行わないと、音が聞こえません。

問題は私がコンソールプログラムを書いていることです。SetCooperativeLevelは最初の引数としてHWNDが必要です。私はコンソールプログラムで対処するHWNDを持っていません。私はnullポインタを提供しようとしましたが、エラーコードDSERR_INVALIDPARAMで失敗しました。

コンソールプログラムでは、どのようなHWND値をIDirectSound8::SetCooperativeLevelに入力する必要がありますか?プログラムのオーディオ部分は共有ライブラリとして構築される予定であるため、「外部」プログラムの知識はほとんどありません。

アドバイスありがとうございます!

注:私は、SDL、OpenAL、SFML(OpenALベース)を使用するような単純なオーディオのレンダリングには多少良い解決策があることを知っていますが、私の現在のプロジェクトではDirectSoundが強制されています。


編集:私はGLOBAL_FOCUSバッファを作成するときSetCooperativeLevelためのHWNDとしてデスクトップウィンドウまたはコンソールウィンドウを使用して疑問を削除し、Microsoftのエンジニアからmessageを見つけました。

答えて

2

私はこれを自分でテストしていませんが、隠しウィンドウを作成し、そのHWNDをSetCooperativeLevelメソッドに渡すことで成功するかもしれません。 SetCooperativeLevelはこのhwndを使用して、アプリケーションに入力フォーカスがあるかどうかを判断します。したがって、入力フォーカスが問題ではない協調レベル(たとえば、DSSCL_NORMAL)を選択した場合、入力フォーカスを受け取らない隠しウィンドウとなります。

+0

あなたが言ったように、入力フォーカスは、オーディオをレンダリングするときに干渉してはなりません。私は 'SetCooperativeLevel'に' GetDesktopWindow() 'によって返されたHWNDを提供することを無邪気にテストしました。しかし、私は隠されたウィンドウハンドルを使用することに比べて何らかの欠点があるかどうかわかりません。 – overcoder

+0

あなたが制御しないHWNDを渡すことは非常に悪い考えのようです。これはおそらくうまくいくでしょう。あなたのコードが日常的に、または「新しい古いもの」で解剖されるまで、それはおそらくうまくいくでしょう。 – snemarch

+0

@overcoder、私は別のプログラムが同じことをすることにしたら何が起こるか心配です。 – bdonlan

2

この::GetDesktopWindow()を使用できます。

関連する問題