如何在没有 DLL 的情况下创建全局 WH_GETMESSAGE HOOK
Posted
技术标签:
【中文标题】如何在没有 DLL 的情况下创建全局 WH_GETMESSAGE HOOK【英文标题】:How to Create a global WH_GETMESSAGE HOOK without DLL 【发布时间】:2011-06-20 02:27:12 【问题描述】:我正在尝试创建一个没有 DLL 的全局 WH_GETMESSAGE HOOK,但我无法成功。 我的操作系统是 Win7 32Bit,这是我的一些代码:
SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,GetModuleHandle(NULL),0);
如果您有时间,请帮助我。 :)
【问题讨论】:
【参考方案1】:As documented,
hMod [输入]
类型:HINSTANCE
包含 lpfn 参数指向的钩子过程的 DLL 句柄。如果 dwThreadId 参数指定由当前进程创建的线程,并且钩子过程在与当前进程关联的代码内,则 hMod 参数必须设置为 NULL。
hMod
必须是 DLL 的句柄。不是EXE。这是因为 DLL 将被加载到所有正在运行的要挂接的进程中,并且它的代码直接从这些进程中运行。
【讨论】:
感谢您的回答,但对我来说似乎没用。 我想还有别的办法。谢谢~。 @italkboy,你应该写下你的替代方法作为答案,这样其他有同样问题的人也可能会得到帮助...... @italkboy,那么没问题 - 如果您确实找到了解决方案,给未来的旅行者留下提示会很有帮助:) 通常的方法是专门为钩子创建一个 DLL,顺便说一句。跨度> 感谢您的关注,找到解决办法后告诉您。【参考方案2】:在SetWindowsHookEx的调用线程中需要一个消息循环
while(GetMessage(&msg, NULL, 0, 0))
TranslateMessage(&msg);
DispatchMessage(&msg);
【讨论】:
【参考方案3】:很明显,最后一个参数不应该是'0',它应该是你要调用函数的线程的线程id。你不能为最后一个参数和next to last参数都传入null .使用 GetThreadId() 获取当前线程的 id,这很可能是您想要做的。
之前发帖人的回答对你很有用,如果你读过它,你自己就会看到上面的。
【讨论】:
非常感谢,我找到了折衷方案,我会再试一次。:)以上是关于如何在没有 DLL 的情况下创建全局 WH_GETMESSAGE HOOK的主要内容,如果未能解决你的问题,请参考以下文章
如何在不通过 COM 的情况下从 VB6 调用 C++ DLL?
如何在没有regsvr32的情况下注册glut32.dll?
Compact Framework - 如何在没有默认构造函数的情况下动态创建类型?