关于c#:使用” hwnd”注册到窗口消息

 2021-02-24 

Register to window messages using 'hwnd'

假设我对活动窗口具有有效的hWnd(例如,它是使用" GetForegroundWindow"或FindWindow检索的),那么我是否可以从另一个应用程序向该Windows消息注册此hWnd?是否有任何Win32 API或内置的C#方法?

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

谢谢,

Elad


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

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

请注意,当您使用WINEVENT_OUTOFCONTEXT时,您自己的代码将需要在调用SetWinEventHook的线程上运行消息循环。同样,收到的通知不会立即传递,但会稍有延迟(类似于PostMessage),但是对于您的目的而言可能仍然足够快,可以避免进行进程内挂接。

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


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