如何在控制台程序中为DirectSound SetCooperativeLevel提供HWND?

时间:2011-07-15 23:11:49

标签: windows directsound

我正在编写一个使用DirectSound API呈现某些音频数据的控制台程序。在跟踪DirectSound Programming Guide (from Microsoft)时,我偶然发现了一个奇怪的问题。根据{{​​3}}:

  

创建设备对象后,必须使用documentation方法设置设备的协作级别。除非你这样做,否则不会听到任何声音。

问题是我正在编写一个控制台程序,而SetCooperativeLevel需要一个HWND作为第一个参数。我没有在控制台程序中处理任何HWND。我尝试提供空指针,但失败了DSERR_INVALIDPARAM错误代码。

在控制台程序中应该向IDirectSound8::SetCooperativeLevel提供什么HWND值?该程序的音频部分计划构建为共享库,因此它几乎不了解“外部”程序。

感谢您的任何建议!

注意:我知道有一个更好的解决方案可以简单地渲染音频,比如使用SDL,OpenAL,SFML(基于OpenAL),但对于我当前的项目,DirectSound是强制执行的。


编辑:我从Microsoft工程师那里找到了一个IDirectSound8::SetCooperativeLevel,它在创建GLOBAL_FOCUS缓冲区时消除了对使用桌面窗口或控制台窗口作为SetCooperativeLevel的HWND的疑虑。

2 个答案:

答案 0 :(得分:3)

虽然我自己没有测试过,但您可能会成功创建一个隐藏窗口并将其HWND传递给SetCooperativeLevel方法。 SetCooperativeLevel使用此hwnd来确定应用程序何时具有输入焦点;因此,如果您选择输入焦点无关紧要的合作级别(例如DSSCL_NORMAL),则隐藏窗口(永远不会接收输入焦点)应该正常。

答案 1 :(得分:2)

您可以使用此::GetDesktopWindow()