如何安全地从DLL钩入消息泵

How do I safely hook into the message pump from a DLL?

本文关键字:DLL 消息 何安全 安全      更新时间:2023-10-16

我正在尝试从加载DLL的进程获取消息。

我试过:

SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, hInstance, 0);

这给了我关于如何"程序X无法启动,因为y.d dll从您的系统中丢失"的错误弹出框。这就是我在标题中加上"安全"的原因。

我也试过了:

SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, hInstance, threadId);

其中threadId是我的DLLMain中GetCurrentThreadId()的结果。这个可以工作,但是我没有得到窗口的任何消息(只有一堆512和1025)。

消息与线程和窗口有关,您的DLL可能由进程加载。所以没有直接对应关系。

另一方面,

钩子要么是全局的,要么是单线程的。

总的来说,这意味着你必须选择是否只需要来自特定线程的消息,还是全局(特定桌面中所有进程中的所有线程),在全局中你将过滤掉你自己感兴趣的进程。

第二个代码片段是一个线程钩子。第一个是全局钩子,你肯定做错了什么,因为成功的钩子本身不会导致你提到的错误消息。

我猜你直接从DLLMain内部调用这些函数。对于可以安全地从DLLMain调用哪些函数有严重的限制,请参阅MSDN文档中的DLLMain。

没有明确的安全和不安全的函数列表,但似乎很可能在你的第一个代码片段中调用SetWindowsHookEx正在做一些在DLLMain函数中被禁止的事情,因此DLL无法正确加载