Windows 如何从DLL中获取HWND?

Windows 如何从DLL中获取HWND?,windows,winapi,dll,hwnd,directsound,Windows,Winapi,Dll,Hwnd,Directsound,我有一个DLL,我想用直接声音播放声音。为了播放声音,我需要可执行文件的HWND。我没有加载DLL的可执行文件的HWND。如何在不从可执行文件中传入的情况下在DLL中获取它?您可以使用它来获取当前进程Id 然后,您可以调用EnumWindows,并使用检查每个窗口以查找与您的进程关联的窗口 然而,一个更简单的选择可能是只生成自己的窗口。您可以创建一个不可见的1x1像素窗口,并将其与直接声音一起使用 即使您的调用进程没有可用的窗口(或定期删除窗口句柄),这种方法也可以工作。在主线程上调用。这会给你

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

您可以使用它来获取当前进程Id

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

然而,一个更简单的选择可能是只生成自己的窗口。您可以创建一个不可见的1x1像素窗口,并将其与直接声音一起使用


即使您的调用进程没有可用的窗口(或定期删除窗口句柄),这种方法也可以工作。

在主线程上调用。这会给你带来很多麻烦。如果需要顶级HWND,请选择任何一个有效的HWND(并非所有值都可以填充),并使用可执行文件的
get祖先(GA_ROOT)

HWND
查找其顶级祖先?“HWND”代表“窗口把手”。。。你的意思是
HMODULE
?@Mehrdad:我想他需要在流程中找到一个窗口。。。Direct Sound需要HWND进行初始化。你能创建你自己的(隐藏)窗口吗?我将尝试创建一个像你和shf301建议的小窗口。创建窗口当然是很有可能的,但它确实不应该是你的第一选择-windows有点缺乏资源,有他们自己的需求,并且通常针对他们自己的消息循环的实际UI应用程序(隐式或显式),这是一个小DLL需要考虑和实施的事情。通常最好是通过DLL函数将HWND引用传递给DLL,或者从正在运行的、可控的进程中获取一些可验证的HWND—当然,必须对该进程进行监视…@我并不总是这么认为—如果您不确定DLL将如何使用,并且希望它是通用的,那么这是一个安全的选项。依赖可能被破坏的HWND有其自身的缺点。在DLL中生成窗口从来都不是“安全的”。完全这实际上是一个安全风险和稳定性问题,因为您的DLL可以在没有通知的情况下卸载/销毁,从而泄漏整个窗口等等。大多数情况下,这就是专业人士所说的“坏代码”。如果这仍然是1990年代,这样一个DLL很容易使整个系统崩溃,因为它超载了内存泄漏。感谢上帝,现在是21世纪。