windows Hook技术 限制鼠标仅能在指定区域活动

在这里插入图片描述
hook (Windows系统机制)
• Hook是Windows中提供的一种用以替换DOS下“中断”的系统机制,中文译为“挂钩”或
“钩子”
。在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程
序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。
• 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定
窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处
理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
• 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,
在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函
数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息
的传递。
Hook原理
• 每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定
的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程序。当与指定的Hook类
型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,
或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,
而最早安装的钩子放在最后,也就是后加入的先获得控制权。
• Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放
其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系
统会自动为它做卸载钩子的操作。
• 钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定
义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可
以是系统中所有线程的事件。
系统钩子与线程钩子
• SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程
钩子。
• 线程钩子用于监视指定线程的事件消息。线程钩子一般在当前线程或者当前线
程派生的线程内。
• 系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有
的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。系统自动将
包含“钩子回调函数”的DLL映射到受钩子函数影响的所有进程的地址空间中,
即将这个DLL注入了那些进程。
钩子函数
• (1)设置钩子:SetWindowsHookEx
• (2)释放钩子:UnhookWindowsHookEx
• (3)继续钩子:CallNextHookEx
• 在线程级的钩子中经常用到 GetCurrentThreadID 函数来获取当前线程
的 ID


#include <Windows.h>
#include <cmath>

LRESULT CALLBACK MouseHookFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
	// 低级鼠标输入事件相关消息
	PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT)lParam;

	bool bControl = false;

	//  获取屏幕的分辨率
	static float screen_cx = GetSystemMetrics(SM_CXSCREEN);
	static float screen_cy = GetSystemMetrics(SM_CYSCREEN);

	// 获取屏幕中心
	static float screen_center_x = screen_cx / 2.0f;
	static float screen_center_y = screen_cy / 2.0f;

	// 计算远离屏幕中心距离
	float dx = p->pt.x - screen_center_x;
	float dy = p->pt.y - screen_center_y;
	float fDist = sqrt(dx*dx + dy*dy);

	// 检查光标是离开屏幕中心200px
	if (fDist > 200)
	{
		float angle = atan2(dy, dx);

		// 陷阱光标
		SetCursorPos(int(screen_center_x + cos(angle) * 200), int(screen_center_y + sin(angle) * 200));

		// 停止窗口处理事件
		bControl = true;
	}

	// 设置一个钩子程序可以调用此函数之前或之后处理的钩子信息
	return (bControl ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));		// 继续钩子
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// 设置鼠标钩子
	HHOOK hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookFunc, hInstance, NULL);
	
	// 等待用户操作退出此程序
	MessageBox(NULL, L"你点击之后会自动退出控制权.", L"提示", MB_OK | MB_ICONERROR);

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值