2011-07-15 29 views
5

我在寫一個控制檯程序,它使用DirectSound API來渲染一些音頻數據。遵循DirectSound Programming Guide (from Microsoft)時,我偶然發現了一個奇怪的問題。按照documentation如何在控制檯程序中向DirectSound SetCooperativeLevel提供HWND?

創建設備對象後,您必須使用IDirectSound8::SetCooperativeLevel方法爲設備設置的合作水平。除非你這樣做,否則聽不到任何聲音。

問題是我正在編寫一個控制檯程序,而SetCooperativeLevel需要一個HWND作爲第一個參數。我沒有任何HWND在控制檯程序中處理。我試過提供一個空指針,但是它的失敗代碼爲DSERR_INVALIDPARAM

應該在控制檯程序中爲IDirectSound8::SetCooperativeLevel提供什麼HWND值?該計劃的音頻部分計劃建成一個共享庫,所以它幾乎不知道「外部」計劃。

感謝您的任何建議!

注意:我知道對於簡單渲染音頻(如使用SDL,OpenAL,SFML(基於OpenAL))有一些更好的解決方案,但是對於我當前的項目DirectSound已得到執行。


編輯:我從微軟工程師,消除有關創建GLOBAL_FOCUS緩衝區時,使用的桌面窗口或控制檯窗口的HWND爲SetCooperativeLevel疑惑找到了message

回答

2

雖然我自己沒有測試過,但是您可能會創建一個隱藏窗口並將其HWND傳遞給SetCooperativeLevel方法,但可能會取得一些成功。 SetCooperativeLevel使用此hwnd來確定您的應用程序何時具有輸入焦點;因此,如果您選擇輸入焦點無關緊要的協作級別(例如,DSSCL_NORMAL),則隱藏的窗口(將永遠不會接收輸入焦點)應該沒問題。

+0

如上所述,渲染音頻時輸入焦點不應該發生干擾。我無意中測試了將'GetDesktopWindow()'返回的HWND提供給'SetCooperativeLevel',它似乎工作。但是,我不知道它是否有任何缺點與使用隱藏的窗口句柄相比... – overcoder

+0

傳遞一個你不控制的HWND似乎是一個非常糟糕的主意。這是可能工作得很好的事情之一 - 直到你的代碼最終在dailywtf或「舊的新事物」中被解析爲止。 – snemarch

+0

@overcoder,我會擔心如果另一個程序決定做同樣的事情會發生什麼...... – bdonlan

2

你可以使用這個::GetDesktopWindow()

相關問題