【问题标题】:How do I get a HWND from inside a DLL?如何从 DLL 中获取 HWND?
【发布时间】:2011-06-13 12:50:37
【问题描述】:

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

【问题讨论】:

  • HWND 的可执行文件? “HWND”代表“窗口句柄”...您的意思是HMODULE
  • @Mehrdad:我认为他在进程中需要一个窗口的 HWND...Direct Sound 需要一个 HWND 进行初始化。
  • 您能创建自己的(隐藏)窗口吗?

标签: windows winapi dll hwnd directsound


【解决方案1】:

在主线程上调用GetGUIThreadInfo。这会为您带来一堆 HWND。如果您需要顶级 HWND,请选择任何有效的(并非所有值都可能被填充)并使用 GetAncestor(GA_ROOT) 找到其顶级祖先。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我将尝试创建一个像你和 shf301 建议的小窗口。
    • 创建窗口当然是很有可能的,但它真的不应该是你的首选——窗口有点资源消耗,有自己的需求,通常针对具有自己的消息循环的实际 UI 应用程序(无论是隐式还是显式),对于一个小型 DLL,需要考虑和实现很多。通过 DLL 函数将 HWND 引用传递给 DLL 或从正在运行的可控进程中获取一些可验证的 HWND 通常要好得多 - 当然,必须监视这个进程......
    • @specializt 不过,不要总是同意——如果你不确定你的 DLL 将如何被使用,并且希望它是通用的,这是一个安全的选择。依赖可能被破坏的 HWND 有其自身的缺点。
    • 在 DLL 中生成窗口是从不“安全的”。完全没有。它实际上是一个安全风险和稳定性问题,因为您的 DLL 可以在没有通知的情况下被卸载/销毁,泄漏整个窗口等等。它主要是专业人士所说的“坏代码”。如果这仍然是 1990 年代,那么这样的 DLL 很容易使整个系统崩溃,因为它因内存泄漏而过载。感谢上帝,现在是 21 世纪。
    猜你喜欢
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多