使用全局的 HOOK

  使用全局的HOOK需要一个 dll 把 setwindowshookex 的代码写到 dll 里,下面给出一个例子

//   这里是 DLL 的代码。。。

extern "C" __declspec(dllexport) BOOL InstallMyHook();  // DLL导出的函数。。。

extern "C" __declspec(dllexport) BOOL UnInstallMyHook();

static HANDLE h_Mydll = INVALID_HANDLE_VALUE; //全局变量保存 dll 的实例句柄 下面会用到。
static HHOOK h_Hook  = NULL;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
      )
{
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH :
        h_Mydll=hModule;
 // InstallMyHook();
  break;
 default:
  break;
 }
    return TRUE;
}

LRESULT CALLBACK GetMsgProc(  int code,       // hook code
       WPARAM wParam,  // removal flag
       LPARAM lParam )  // address of structure with message); 
{
 LPMSG p_Msg=(LPMSG)lParam;
 if (p_Msg->message==WM_KEYDOWN)  //键按下的消息
 {
  if (p_Msg->wParam==VK_RETURN) //判断按键是不是 回车。
  {
           MessageBox(NULL,"you press return !",NULL,NULL);
  }
  return 0;
 }
 return CallNextHookEx(h_Hook,code,wParam,lParam);
}

extern "C" __declspec(dllexport) BOOL InstallMyHook()
{
   h_Hook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,(HINSTANCE)h_Mydll,0); // 0 全局 HOOk 
   return TRUE;
}

extern "C" __declspec(dllexport) BOOL UnInstallMyHook()
{
 UnhookWindowsHookEx(h_Hook);
 return TRUE;
}

 

下面是exe的代码

#include <windows.h>
#include <stdio.h>

int main()
{
    HMODULE hModule=LoadLibrary("MyHook.dll");  
    FARPROC p_Dll=GetProcAddress(hModule,"InstallMyHook"); 获得dll里的导出函数
     p_Dll();  
    getchar();

 return 0;
}

你可能感兴趣的:(使用全局的 HOOK)