Hook学习笔记(一)Hook局部钩子实现
来源:互联网 发布:钢筋工程量计算软件 编辑:程序博客网 时间:2024/04/30 18:30
一、初试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,在文本框里可以正常输入空格了。
第一个学习笔记就到这里了。
- Hook学习笔记(一)Hook局部钩子实现
- HOOK钩子机制学习笔记
- VC局部钩子[HOOK]的实现
- HOOK钩子机制学习笔记(1)
- HOOK钩子机制学习笔记(1)
- HOOK钩子机制学习笔记(2)
- HOOK钩子机制学习笔记(3)
- HOOK钩子机制学习笔记(1)
- HOOK钩子机制学习笔记(1)
- vc 局部钩子HOOK(线程钩子)
- HOOK钩子机制学习笔记(4) - 钩子函数说明
- HOOK钩子机制学习笔记(4) - 钩子函数说明
- API HOOK学习笔记一
- 钩子 (Hook) Hook解释
- C++钩子(Hook)实现初探
- C++钩子(Hook)实现初探
- 钩子(Hook)
- hook(钩子)
- 《真心话大冒险》微电影启动 张宁江献青涩初吻_0
- Eclipse关闭No grammar constraints (DTD or XML schema) detected for the document警告
- linux下一个内存池实现
- 小菜的GIS之路
- 怎么在在视图中显示鼠标位置 mfc
- Hook学习笔记(一)Hook局部钩子实现
- test
- Linux内核大讲堂 (二) 传说中的字符设备(2)
- android repo 获取源码出错
- 如何删除MyEclipse中已经配置好的Struts2
- Codeforces Round #102 (Div. 2)——B
- 筛法 简单演示程序
- TCP程序设计(单线程服务器和多线程服务器学习)
- Reading package lists... Error! 解决方案