2011-02-18 51 views
-1

我目前正试图从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?

谢谢

+1

您没有发布回调函数,很难猜测。 – 2011-02-18 03:32:14

+0

另外,您不需要在DLL中共享部分。每次调用RegisterWindowMessage(_T(“WM_HOOKEX_RK”))都会返回相同的值。 – 2011-02-18 19:51:28

回答

2

第一个问题,你为什么这样做:作为

hHook = SetWindowsHookEx(WH_CALLWNDPROC,HookProc, 
          g_hInstDll, GetWindowThreadProcessId(plist,NULL)); 

究竟是什么给了你的想法,最好的方式来处理一个类型不匹配

hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HookProc, 
          g_hInstDll, GetWindowThreadProcessId(plist,NULL); 

改写错误只是为了施放它?您需要修复HookProc,因此它实际上是正确的功能类型。

相关问题