SetWindowsHookEx用的是WH_CALLWNDPROC,系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。这是最关键的部分。DWORD dwCurrentPID = 0; 
HHOOK hOldHook = NULL; 
DWORD pSend = 0; 
DWORD pRecv = 0; 
GETMESSAGE pGetMessage = NULL; BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 }; 
DWORD dwOldBytes[3][2]; HANDLE hDebug = INVALID_HANDLE_value; LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam ) 

DWORD dwSize; 
DWORD dwPIDWatched; 
HMODULE hLib; if( dwCurrentPID == 0 ) 

dwCurrentPID = GetCurrentProcessId(); 
HWND hwndMainHook; 
hwndMainHook = ::FindWindow( 0, "MainHook" ); 
dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); if( dwCurrentPID == dwPIDWatched ) 

  //替换函数

} if( hOldHook != NULL ) 

return CallNextHookEx( hOldHook, nCode, wParam, lParam ); 
} return 0; 
}dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 
hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 
这两句怎么理解啊?dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 可以理解为MainHook窗口进程 处理消息WM_USER+100的时候,返回一个MainHook窗口的进程号.但::SendMessage又会调用CallWndProc不就循环了么?hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 是用来干什么的?

解决方案 »

  1.   

    if( dwCurrentPID == 0 ) 
    因为有这句,所以不会循环
    单个进程只能进入这个If语句一次/*
    dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 
    hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 
    这两句怎么理解啊?
    */
    具体要看窗口处理过程函数
      

  2.   

    dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 
    是取得你想要钩住的指定进程IDhOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 
    是取得 SetWindowsHookEx 的Hook 就是原钩子函数的地址SendMessage又会调用CallWndProc不就循环了么?
    这个可以在函数加判断防止死循环
      

  3.   

    谢谢:
     microsoftwin(流星雨点), zzz3265(zzz) 的解答.hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 
    是取得 SetWindowsHookEx 的Hook 就是原钩子函数的地址
    还是没有太弄明白,能解释的更清楚么?thanks
      

  4.   

    ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); 
    是给你的窗口名称为MainHook的程序发送一个消息,WM_USER+100应该在MainHook的程序中有定义,也就是MainHook窗口的进程号。
    ::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 );返回的东西要看你的程序中(WM_USER+101)是完成什么内容!看来是个句柄之类的东西!
      

  5.   

    SendMessage的调用是阻塞方式的,就是知道SendMessage发送出去的消息被处理完毕,才会返回,否则回一直等待!
      

  6.   

    有人回答这个问题么?
    hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); 是用来干什么的?
      

  7.   

    相当于调用了一个函数,不过是调用别一个进程的,
    取得一HHOOK的值
      

  8.   

    , (WM_USER+101), 这个是用户自定义的消息,只能定义的人才知道了.