我在寫一個控制檯程序,它使用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。
如上所述,渲染音頻時輸入焦點不應該發生干擾。我無意中測試了將'GetDesktopWindow()'返回的HWND提供給'SetCooperativeLevel',它似乎工作。但是,我不知道它是否有任何缺點與使用隱藏的窗口句柄相比... – overcoder
傳遞一個你不控制的HWND似乎是一個非常糟糕的主意。這是可能工作得很好的事情之一 - 直到你的代碼最終在dailywtf或「舊的新事物」中被解析爲止。 – snemarch
@overcoder,我會擔心如果另一個程序決定做同樣的事情會發生什麼...... – bdonlan