如何安全地从DLL挂钩消息泵?

时间:2011-09-30 08:49:13

标签: c++ windows

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

我试过了:

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

这给了我关于“程序X无法启动因为系统中缺少Y.dll”的错误弹出窗口。这就是我把“安全”放在标题中的原因。

我也试过了:

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

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

2 个答案:

答案 0 :(得分:4)

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

另一方面,钩子是全局的或每个线程。

这一切意味着您必须选择是仅希望来自特定线程的消息,还是全局(特定桌面中所有进程中的所有线程),您将自己过滤掉您感兴趣的过程。

您的第二个代码段是一个线程挂钩。第一个是全局钩子,你肯定做错了,因为成功的钩子本身不会引起你提到的错误信息。

答案 1 :(得分:0)

我猜你是直接从DLLMain中调用这些函数。您可以从DLLMain安全地调用哪些函数存在严重的限制,请参阅MSDN documentation on DLLMain有关此问题。

没有明确的安全和不安全函数列表,但似乎第一个代码片段中对SetWindowsHookEx的调用正在执行DLLMain函数中禁止的操作,因此DLL无法正确加载。 / p>