【发布时间】:2011-02-18 01:28:43
【问题描述】:
我目前正在尝试将http://www.codeproject.com/KB/threads/winspy.aspx(子类化部分)中的一些代码实现到我的项目中,但是遇到了一些问题,我调试了 dll,似乎当我向被钩子发送完全相同的消息(或者我认为)时线程的 hwnd 消息似乎有所不同(由于直接通过 Visual Studio 调试 dll 文件,我看到了这一点)。
因此,从一开始,我就为所有 dll 实例共享我的自定义 winregistered mssg。在这里,我正在编写我用于两个项目的内容(从上面的站点下载的项目,以及我当前尝试模仿相同策略的项目)
我首先与所有 dll 实例分享我稍后将注册的消息(在 dll 进程中)..
#pragma data_seg("共享") UINT WM_HOOKEX = 0; #pragma data_seg()好的,现在是时候在 dll 附加时注册它了...
BOOL APIENTRY DllMain( 处理 hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { 如果(ul_reason_for_call == DLL_PROCESS_ATTACH) { g_hInstDll = (HINSTANCE) hModule; ::DisableThreadLibraryCalls(g_hInstDll); 如果(WM_HOOKEX==NULL) WM_HOOKEX = ::RegisterWindowMessage(_T("WM_HOOKEX_RK")); } 返回真; }最后,在我连接到线程后,我发送消息
hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookProc, g_hInstDll, GetWindowThreadProcessId(plist,NULL) ); SendMessage(hwnd,WM_HOOKEX,0,1);现在感谢 VS dll 调试,我可以检查另一端是如何接收此消息的,在原始“注入代码的 3 种方式”项目子类化部分的情况下,参数是
wparam = 1 lparam = 23720848在我的项目中
wparam = 0 lparam = 23720824似乎在调试过程中根本无法识别 WM_HOOKEX,使用相同的参数!
我真的不明白,我用完全相同的名称注册 dll 进程附加的钩子,除了我使用 WM_HOOKEX = ::RegisterWindowMessage( _T("WM_HOOKEX_RK") );" 和 _T 因为我的项目是 unicode 但我真的怀疑这很重要。
其他一切都是 100% 相同
SendMessage(相同的hwnd,相同的mssg,0,1);
任何想法为什么我的项目中的另一方不会看到正确的 mssg 和正确的 paras?
谢谢
【问题讨论】:
-
你没有发布回调函数,很难猜。
-
另外,你不需要在你的 DLL 中修改共享部分。每次调用 RegisterWindowMessage(_T("WM_HOOKEX_RK")) 都会返回相同的值。
-
这个问题在当前状态下毫无意义。您将 wParam=0 和 lParam=1 传递给 SendMessage,它根本不映射到您在钩子 proc 中获得的 wParam 和 lParam。你需要包含回调函数!
-
请忽略这个问题,放弃它并用静态布尔检查解决它,谢谢帮助