Windows消息钩取

Windows消息钩取

什么是Windows消息钩取

Windows消息钩取就是利用Windows的消息机制,将消息在发往应用程序之前拦截,从而完成我们需要的一些功能,再将消息发给应用程序。

举个例子:

当我按下键盘的时候,OS会将消息放大消息列表,然后查看是哪个应用程序中发生了消息事件,然后将消息发给应用程序;

应用程序将OS发过来的消息放到自己的消息队列中;

应用程序监视自己的消息队列,发现OS发过来的消息后,再调用相应的事件处理程序。

那么消息钩取就是在这中间做文章,利用SetWindowsHookEx()API在OS将消息发给应用程序之间建立钩链拦截消息,完成我们自己的处理后,再将消息发给应用程序

SetWindowsHookEx

SetWindowsHookEx()API原型如下:

HHOOK SetWindowsHookEx(
	int idHook,			//钩子的类型,如钩取键盘消息(WH_KEYBOARD)
    HOOKPROC lpfn,		//钩子过程函数,里面就是我们想要添加或修改的功能
    HINSTANCE hMod,		//钩子过程函数所属的DLL模块句柄
    DWORD dwThreadId	//想要挂钩的线程ID,如果设置为0,则为全局钩子
);

该API的第二个参数就是钩子过程,

比如键盘钩子过程函数:

原型如下:

LRESULT CALLBACK KeyboardProc(
	int code,		//表示钩子过程如何处理消息,如果该参数小于0,那么钩子过程必须将
    				//消息传递给CallNextHookEx函数,而不用进一步处理,并且返回
    				//CallNextHookEx函数返回的值
    WPARAM wParam,	//指用户按下的虚拟按键
    LPARAM lParam	//这个参数的最高位的值不同会有不同的含义,
);					//如0=key press,1=key release

注意:

钩子过程函数必须放在DLL文件中,SetWindowsHookEx()API可以放在任何位置,可以在钩取主程序内,也可以在DLL内

开始钩取

有了上述2个API,我们可以开始编写钩子程序了

windows_news_gouqu.cpp

先理一下思路,在钩子主程序中需要什么东西:

1.将SetWindowsHookEx写在DLL内,设置为导出函数

2.要加载我们编写的DLL(这个DLL文件就是用来放钩子过程的)

3.加载了DLL之后,得到导出函数地址,再将地址转换为函数

4.调用导出函数

5.完成钩取

6.终止钩取

7.卸载DLL

在这里插入图片描述

注意:

1.这里可以使用指针函数将函数地址转化为相应函数

2.要使用DLL中的函数,必须将该函数设置为导出函数,也就是使用关键字__declspec(dllexport)

再来看看DLL源文件:

在这里插入图片描述

控制台输入指令:

在这里插入图片描述

可以看到,钩子设置成功:

在这里插入图片描述

打开notepad,发现键盘输入无响应:

在这里插入图片描述

但是其他程序正常工作:

在这里插入图片描述

钩取成功

注意点:

1.回调函数会在每一次发生键盘消息的时候被调用,也就是说你每按一次键盘,回调函数都会被调用

2.当调用SetWindowsHookEx的时候,一定要先给定DLL的句柄,否则会调用无效!!!

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值