我正在编写一个控制台程序,使用DirectSound API来渲染一些audio数据。 遵循DirectSound编程指南(来自Microsoft)时,我偶然发现了一个奇怪的问题。 根据文件 :
创build设备对象后,必须使用IDirectSound8 :: SetCooperativeLevel方法设置设备的协作级别。 除非你这样做,否则听不到任何声音。
问题是我正在编写一个控制台程序, SetCooperativeLevel
需要一个HWND作为第一个参数。 我没有任何HWND在控制台程序中处理。 我试图提供一个空指针,但是失败了一个DSERR_INVALIDPARAM
错误代码。
什么HWND值应该提供给控制台程序中的IDirectSound8::SetCooperativeLevel
? 该计划的audio部分计划build成共享库,所以它几乎不知道“外部”的程序。
感谢您的任何build议!
注意:我知道有一个更好的解决scheme来简单地渲染audio,比如使用SDL,OpenAL,SFML(基于OpenAL),但是对于我当前的项目DirectSound被强制执行。
编辑 :我发现了一个微软工程师的消息 ,创buildGLOBAL_FOCUS缓冲区时,消除有关使用桌面窗口或控制台窗口作为SetCooperativeLevel
的HWND的SetCooperativeLevel
。
虽然我没有自己测试过,但是你可能会创建一个隐藏窗口并将其HWND传递给SetCooperativeLevel
方法。 SetCooperativeLevel
使用此hwnd来确定您的应用程序何时具有输入焦点; 因此,如果您选择输入焦点无关的协作级别(例如, DSSCL_NORMAL
),则隐藏的窗口(将永远不会接收输入焦点) 应该没问题 。
你可以使用这个::GetDesktopWindow()
。