Hook局部钩子实现

发布时间:2017年12月7日 作者:未知 查看次数:1079

Hook局部钩子实现

自:http://m.blog.csdn.net/xing_yufei/article/details/8458858

Hook学习笔记(一)Hook局部钩子实现


一、初试Hook,屏蔽鼠标消息

创建一个MFC工程,工程名test,基于对话框

创建一个全局函数,这个函数一会会被安装为钩子

LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return 1; //截获消息后不对消息再进行任何操作,起到屏蔽消息的作用。
}

找到CtestDlg的OnInitDialog()函数添加下面的代码:
SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());

生成解决方案,执行一下,发现鼠标在这个程序的界面上失效了。

二、屏蔽键盘消息

在资源视图中,为对话框添加一个编辑框。

创建一个全局变量HHOOK g_hKeyBoard;

这个变量一会用来接收SetWindowsHookEx所产生的钩子句柄。

创建一个全局函数:

LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(wParam==VK_SPACE)
return 1;//如果截获的消息是空格,不对消息采取任何操作,退出函数
else
return CallNextHookEx(g_hKeyBoard, nCode,wParam,lParam);//其它情况下,将消息传递给下一个钩子,在这里消息就被传递到这个对话框了
}

转到CtestDlg::OnInitDialog()

将SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());修改为:

SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,NULL,GetCurrentThreadId());

重新生成这个工程的解决方案,执行一下这个程序,在编辑框中输入,会发现按空格不会有反应了。

按下Alt+F4,退出这个程序。

现在我想屏蔽Alt+F4,可以修改回调函数:

LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(wParam==VK_SPACE)
return 1;
else if(wParam==VK_F4&&lParam>>29&1)
return 2;//lParam的第29位如果是1的话,表示Alt按下,具体请参见《windows程序设计(第五版)》第197页
else
return CallNextHookEx(g_hKeyBoard, nCode,wParam,lParam);
}

重新生成这个工程的解决方案,执行一下这个程序,会发现再按Alt+F4不会退出程序了。

现在试试按F3退出程序,修改回调函数:

LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(wParam==VK_SPACE)
return 1;
else if(wParam==VK_F4&&lParam>>29&1)
return 2;
else if(wParam==VK_F3)
::SendMessage(::AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,0);//发送关闭的消息给窗口
else
return CallNextHookEx(g_hKeyBoard, nCode,wParam,lParam);
}

重新生成这个工程的解决方案,执行一下这个程序,会发现按Alt+F4不会退出程序,按F3退出了程序。

按F5,恢复这个程序正常的消息机制,修改回调函数:

LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(wParam==VK_SPACE)
return 1;
else if(wParam==VK_F4&&lParam>>29&1)
return 2;
else if(wParam==VK_F3)
::SendMessage(::AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,0);
else if(wParam==VK_F5)
UnhookWindowsHookEx(g_hKeyBoard);//卸载钩子
else
return CallNextHookEx(g_hKeyBoard, nCode,wParam,lParam);
}

重新生成这个工程的解决方案,执行一下这个程序,按下F5,在文本框里可以正常输入空格了。



版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110