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

我正在编写一个控制台程序,使用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()