我目前正在尝试将http://www.codeproject.com/KB/threads/winspy.aspx(子类化部分)中的一些代码实现到我的项目中,但遇到一些问题,我调试了dll,而且当我发送完全相同的消息(或者我认为)时钩子线程的hwnd消息看起来是不同的(我看到这要归功于通过visual studio直接调试dll文件)。
所以从一开始,我就为所有dll实例共享我的自定义winregistered mssg ..在这里我正在编写我用于两个项目的内容(从上面的网站下载的那个,以及我当前试图模仿相同策略的项目)
我首先与所有dll实例共享我将稍后注册的消息(在dll进程atach中)..
#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,具有相同的参数!
我真的没有得到这个,我用dll进程附加注册钩子与完全相同的名称,除了我使用WM_HOOKEX = :: RegisterWindowMessage(_T(“WM_HOOKEX_RK”));“与_T作为我的项目是unicode但我真的怀疑这很重要。
其他一切都是100%相同
SendMessage(相同的hwnd,相同的mssg,0,1);
为什么我的项目中的另一方看不到正确的错误的正确的mssg?
谢谢
答案 0 :(得分:2)
第一个问题,你为什么要这样做:
hHook = SetWindowsHookEx( WH_CALLWNDPROC,(HOOKPROC)HookProc,
g_hInstDll, GetWindowThreadProcessId(plist,NULL);
将其重写为
hHook = SetWindowsHookEx( WH_CALLWNDPROC,HookProc,
g_hInstDll, GetWindowThreadProcessId(plist,NULL));
EARTH上的内容让您了解处理类型不匹配错误的最佳方法就是投射它?您需要修复HookProc,因此它实际上是正确的功能。