我目前正试图从http://www.codeproject.com/KB/threads/winspy.aspx(子类化部分)实现一些代码到我的项目,但有一些问题,我调试了DLL,似乎当我发送完全相同的消息(或者我认为)到挂钩线程的HWN消息似乎是不同的(我看到这一点,感谢直接通过Visual Studio调试dll文件)。为什么wparam如果使用相同的消息,使用相同的paras?
因此,从一开始,我就分享了我所有的dll实例的自定义winregistered mssg ..在这里,我正在写两种项目(从上面的站点下载的,以及我目前试图模仿相同策略的项目)
我先分享信息,我将在稍后注册(在DLL过程atach)与所有的dll实例..
#pragma data_seg("Shared") UINT WM_HOOKEX = 0; #pragma data_seg()
确定这样的时候DLL重视注册吧...
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { if(ul_reason_for_call == DLL_PROCESS_ATTACH) { g_hInstDll = (HINSTANCE) hModule; ::DisableThreadLibraryCalls(g_hInstDll); if(WM_HOOKEX==NULL) WM_HOOKEX = ::RegisterWindowMessage(_T("WM_HOOKEX_RK")); } return TRUE; }
最后经过我勾线我发送消息
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,使用相同的参数!我使用WM_HOOKEX = :: RegisterWindowMessage(_T(“WM_HOOKEX_RK”));“与_T作为我的项目是unicode,但我注册钩子与DLL进程附加完全相同的名称,但除了我使用WM_HOOKEX = :: RegisterWindowMessage我真的很怀疑这个问题
一切是100%相同
的SendMessage(HWND相同,相同的mssg,0,1);
任何想法,为什么我的项目中对方不会看到正确的mssg with correct paras?
谢谢
您没有发布回调函数,很难猜测。 – 2011-02-18 03:32:14
另外,您不需要在DLL中共享部分。每次调用RegisterWindowMessage(_T(“WM_HOOKEX_RK”))都会返回相同的值。 – 2011-02-18 19:51:28