6

我正在编写一个使用 DirectSound API 呈现一些音频数据的控制台程序。在遵循DirectSound Programming Guide (from Microsoft)时,我偶然发现了一个奇怪的问题。根据文档

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

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

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

感谢您的任何建议!

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


编辑:我发现了一条来自 Microsoft 工程师的消息SetCooperativeLevel,它消除了在创建 GLOBAL_FOCUS 缓冲区时使用桌面窗口或控制台窗口作为 HWND 的疑虑。

4

2 回答 2

3

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

于 2011-07-15T23:35:22.553 回答
2

你可以用这个::GetDesktopWindow()

于 2012-08-23T07:57:32.247 回答