HHOOK SetWindowsHookEx(
  int idHook,       
  HOOKPROC lpfn,     
  HINSTANCE hMod,    
  DWORD dwThreadId  
); 
第一个参数:指定钩子的类型,有WH_MOUSE、WH_KEYBOARD等十多种 
第二个参数:标识钩子函数的入口地址
第三个参数:钩子函数所在模块的句柄;
第四个参数:钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息。为了捕获所有事件,挂钩函数应该放在动态链接库DLL中。在应用程序中提供导出函数,可以不.

解决方案 »

  1.   


    //消息钩子函数
    LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
         HookAllTextOut();
         return CallNextHookEx(g_hHook, nCode, wParam, lParam);}void CmyDlg::Ontest() 
    {
        // TODO: Add your control notification handler code here
        //系统级空Hook,这里用了WH_GETMESSAGE,用其它的也行
         g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, 0);
        //g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, GetCurrentThreadId()); 
    }红色的代码不调用GetMsgProc,而为了为了捕获所有事件,第四个参数就要设置为0,由于钩子函数所在模块的句柄在当前程序中,所以第四个参数也要设置为0.但是为什么不调用GetMsgProc呢?
      

  2.   

    //消息钩子函数 
    LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 

         HookAllTextOut(); 
         return CallNextHookEx(g_hHook, nCode, wParam, lParam); } void CmyDlg::Ontest()  

        // TODO: Add your control notification handler code here 
        //系统级空Hook,这里用了WH_GETMESSAGE,用其它的也行 
         g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, 0); 
        //g_hHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, GetCurrentThreadId());  
    } 红色的代码不调用GetMsgProc,而为了为了捕获所有事件,第四个参数就要设置为0,由于钩子函数所在模块的句柄在当前程序中,所以第三个参数也要设置为0.但是为什么不调用GetMsgProc呢?