HOOK的初步学习(非全局钩子)!

来源:互联网 发布:网络竞速游戏排行榜 编辑:程序博客网 时间:2024/04/28 10:03
 本篇讲述初步的HOOK编程!呵呵,其实万物都是有简单变复杂的,只有掌握了其本质才可以一生二,二生三,三生万物,好啦,不废话了。
 首先HOOK就是钩子的意思,意思就是windows是靠消息机制来运作的,所有的事件都是通过消息来发生,而这个钩子呢就是在操作系统把用户操作的消息传给应用程序的时候把它给钩过来,(有玩过dotad的就和屠夫那钩子一样!好吧,我承认我想歪了)然后先由你来处理,是放行还是改变。所以HOOK是很强大很邪恶的一项技术,比如,对方输入密码什么的不就这样被钩走了……
 此篇讲最初的两项运用,谨以共勉!~以下是实现代码,运行环境VC6.0 
 SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
 这个函数就是设置HOOK的函数,第一个参数是HOOK类型,字面理解这个设置就是过滤鼠标消息,第二个参数就是用哪个函数来处理,此函数要是一个回调函数,第三个是全局钩子才用到的,由于全局钩子要用到DLL,我们这不讲,设为NULL,第四个参数就是在某个线程执行的ID,我们可以用GetCurrentThreadId()来得到。
 LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
 {
  return 1;
 }
 这个函数就是相应的处理函数体。这是回调函数的写法,和普通函数的区别就是类型为LRESULT CALLBACK!
 函数体,就是返回非0值,意思就是不响应。如果这样写,那么目前这个程序就没法用鼠标了。
 SetWindowsHookEx(WH_KEYBOARD,MouseProc,NULL,GetCurrentThreadId());
 和上面一样,无非钩子类型是键盘消息
 LRESULT CALLBACK Keyboard(int nCode,WPARAM wParam,LPARAM lParam)
 {
  return 1;
 }
 呵呵,回调函数也就是名字不一样而已。这样连键盘消息也屏蔽了,目前这个程序是鼠标键盘都没法响应喽。但是我们只想过滤一些我们想屏蔽的按键怎么办呢?如下:
 LRESULT CALLBACK Keyboard(int nCode,WPARAM wParam,LPARAM lParam)
 {
  if(VK_SPACE == wParam)
   return 1;
  else
   return CallNextHookEx(H_hwnd,nCode,wParam,lParam);
 }
 VK_SPACE是Windows定义的一些按键宏,相应的还有VK_K,VK_F4等啦,可以自己去查。
 wParam传递的就是这个按键的虚拟码。判断下就知道了,如果是这个按键就处理,否则就传递给下一个,这样我们就要用到CallNextHookEx();这个函数,不过这个函数要一个钩子句柄,所以我们要保存这个钩子句柄。
 HHOOK H_hwnd=NULL;
 H_hwnd=SetWindowsHookEx(WH_KEYBOARD,MouseProc,NULL,GetCurrentThreadId());
 上面望说了设置钩子函数返回的就是这个钩子的句柄,就这样就得到了此钩子的句柄。后面的参数就一样了!
 大家都知道ALT+F4的作用吧,就是关闭当前应用程序,那像这样的组合键如何屏蔽呢?
 看到lParam参数吗,它是一个32位的二进制数,我们只要判断它第29位是否为1便知道是否用同时按下ALT键了!
 LRESULT CALLBACK Keyboard(int nCode,WPARAM wParam,LPARAM lParam)
 {
  if(VK_F4 == wParam && l1 == lParam >> 29 &1)
   return 1;
  else
   return CallNextHookEx(H_hwnd,nCode,wParam,lParam);
 }
 通过位运算判断它的第29位是否为1,如果是则处理此消息就是这样,便屏蔽了ALT+F4的组合键了。
 例子:当按下F2的时候让程序退出。
 HWND _hwnd=NULL;
 _hwnd=m_hWnd;
 LRESULT CALLBACK Keyboard(int nCode,WPARAM wParam,LPARAM lParam)
 {
  ::SendMessage(_hWnd,WM_CLOSE,0,0);
 }
 
 首先,当按下F2的时候若要关闭程序,我们只要向窗口发送一个WM_CLOSE消息就行,发送消息要用到SendMessage()而这个函数又需要要关闭窗口的句柄,所以我们定义一个句柄_hwnd并且把给它赋值,在MFC程序中,m_hWnd就是程序的句柄。::意思就是SDK的函数,不属于某个类,也就是全局函数。
 当我们做完我们想做的后,就要移除HOOK了,这时候就要用到UnhookWindowsHookEx(H_hwnd);它就需要一个参数便是要移除HOOK的句柄。
 好了,简单的这几个介绍如果明白了,那些更复杂更高级的HOOK应用就容易理解了,呵呵,在此本人也是初学者,抛砖引玉啦!
原创粉丝点击