如何从DLL中获取HWND?

我有一个DLL,我想用Direct Sound播放声音。 为了播放声音,我需要可执行文件的HWND。 我没有加载DLL的可执行文件的HWND。 如何在不从可执行文件传入DLL的情况下获取它?

您可以使用GetCurrentProcessId获取当前进程标识。

然后可以调用EnumWindows,并使用GetWindowThreadProcessId检查每个窗口以查找与您的进程关联的窗口。

但是,更简单的选择可能是生成自己的窗口。 您可以创建一个不可见的1×1像素窗口,并将其用于Direct Sound。

即使您的调用过程没有可用的窗口(或定期删除窗口句柄),也具有工作的优势。

在主线程上调用GetGUIThreadInfo 。 这让你一堆HWNDs。 如果您需要顶级HWND,请选择任何有效的HWND(并非所有值都可以填充),并使用GetAncestor(GA_ROOT)查找其顶级祖先。