【发布时间】:2010-03-31 19:05:45
【问题描述】:
为这个写一个好标题很难。
我正在开发一个 WPF 应用程序,它需要了解系统上是否存在所有其他打开的窗口。我可以通过调用本机 EnumWindows 方法来做到这一点,我可以调用其他本机方法来过滤掉我感兴趣的窗口。这很好。
我遇到的问题是我想知道窗口何时打开或关闭(理想情况下是最小化)。我可以通过使用 EnumWindows 轮询来做到这一点,但我发现这非常慢,即使我将它推到另一个线程。
有没有更好的方法来获取窗口打开/关闭/最小化的通知?请记住,我对非托管代码的了解非常有限。
【问题讨论】:
-
不可能?从这里开始:support.microsoft.com/kb/318804 除了 WH_KEYBOARD_LL 低级挂钩和 WH_MOUSE_LL 低级挂钩,您无法在 Microsoft .NET Framework 中实现全局挂钩。要安装全局挂钩,挂钩必须具有本机 DLL 导出,以便将自身注入另一个需要有效、一致的函数才能调用的进程。此行为需要 DLL 导出。 .NET Framework 不支持 DLL 导出。托管代码没有函数指针一致值的概念,因为这些函数指针是动态构建的代理。
-
这里有一些进展:pastebin.com/1q3qj5iY 如果传递当前线程 ID,当应用程序窗口聚焦和模糊时,我确实会收到消息,但我需要来自 所有 窗口的消息。为线程 id 传递 0 以获取所有消息会导致 SetWindowsHookEx 返回 null。
标签: .net windows winapi pinvoke