使用全局的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;
}