看到网上有很多朋友对与Windows的钩子技术比较感兴趣,我就把自己整理的代码拿出来和大家分享一下。 我这个例子很简单,就是简单的实现了钩子,给大家作为参考例程。 这个程序里拦截了系统中所有进程的鼠标消息(为了能移动鼠标我跳过了WM_MOUSEMOVE消息,否则鼠标就死掉了。),还拦截了键盘消息,启动拦截之后就不能进行键盘输入了。
整个架构是完全按照MSDN上的说明写的,在DLL里导出两个消息处理函数,然后在主程序里使用SetWindowsHookEx函数启动拦截,用UnhookWindowsHookEx停止拦截。
主要代码如下:
//nType ,0-mouse,1-key!
//fInstall,TRUE-install hook FALSE-uninstall hook
//dwThreadId,0-hook all process! other-hook specified process!
HHOOK hMouseHook=NULL,hKeyHook=NULL;
BOOL CMouseKeyHookDlg::SetHook(INT nType, BOOL fInstall, DWORD dwThreadId)
{
BOOL fOk=TRUE;
if(0 == nType)
{
if(fInstall)
{
//Install the windows hook
HINSTANCE hInst=LoadLibrary((LPCTSTR) "MsgHook.dll"); //MsgHook.dll is in the same path
hMouseHook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)GetProcAddress(hInst, "CallBackMouseMsgProc"),hInst,dwThreadId);
fOk=(hMouseHook != NULL);
}
else
{
fOk=UnhookWindowsHookEx(hMouseHook);
hMouseHook = NULL;
}
}
else if (1 == nType)
{
if(fInstall)
{
//Install the windows hook
HINSTANCE hInst=LoadLibrary((LPCTSTR) "MsgHook.dll"); //MsgHook.dll is in the same path
hKeyHook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)GetProcAddress(hInst, "CallBackKeyMsgProc"),hInst,dwThreadId);
fOk=(hKeyHook != NULL);
}
else
{
fOk=UnhookWindowsHookEx(hKeyHook);
hKeyHook = NULL;
}
}
return (fOk);
}
好了,其实代码很简单的,用VC6.0可以编译通过。
消息Hook源码下载:
点这里下载MouseKeyHook