使用'hwnd'注册窗口消息

时间:2011-06-19 14:23:30

标签: c# winapi

假设我有一个有效的hWnd到活动窗口(例如,它是使用'GetForegroundWindow'或FindWindow检索的),我可以从另一个应用程序注册到这个hWnd的windows消息吗?是否有任何Win32 API,或内置的C#方法?

示例:在我的控制台应用程序中,我有一个hWnd到'记事本'窗口(在后台运行)。我能以某种方式注册消息,指示“记事本”窗口已移动,更改大小,最小化,关闭等等吗?

谢谢,

埃拉德

2 个答案:

答案 0 :(得分:2)

您必须将DLL注入拥有该窗口的进程。使用SetWindowsHookEx(),WH_CALLWNDPROC钩子。您无法使用C#语言编写此类DLL,该过程将无法初始化CLR并准备好运行您的代码。本机代码是必需的。检查this project

答案 1 :(得分:2)

如果您只是需要了解它的移动或关闭,请查看SetWinEventHook。你必须为此编写一个P / Invoke包装器,因为.Net API中没有等效的包装器。您可以使用它而无需注入DLL(使用WINEVENT_OUTOFCONTEXT flag),所以可以保留C#中的所有内容(这也避免了在单独的DLL和主进程之间进行通信的麻烦)。

您可能想要事件EVENT_OBJECT_LOCATIONCHANGE和EVENT_OBJECT_DESTROY。请注意,您在正在收听的线程上获取所有HWND的这些内容,因此您需要在回调中通过HWND进行过滤。

请注意,当您使用WINEVENT_OUTOFCONTEXT时,您自己的代码需要在调用SetWinEventHook的线程上运行消息循环。此外,您收到的通知不会立即发送 ,但稍有延迟(类似于PostMessage),但这可能仍然足够快,您可以避免执行进程内挂钩

您可以使用Windows SDK中的Accessible Event Watcher应用程序(AccEvent)在开始编写代码之前查看记事本中可用的消息。