win32-Hook技术简单了解

9 篇文章 0 订阅

//以下代码定义了一个简单的进程鼠标移动事件钩子

详细内容参考链接:

https://www.bilibili.com/video/av57998681

关于如何创建一个Win32窗口的知识可参考:
https://blog.csdn.net/qq_42418668/article/details/88917947

如何钩子的回调函数的返回值为1即代表消息不发送到操作系统为应用程序维护的消息队列中去,这也是我们无法正常使得应用程序响应消息的一种方式,那么我们也可以让其可以正常的传递下去使用CallNextHookEx函数。

 

根据图片,我们的HOOK技术相当于就是在操作系统捕获用户的动作,添加到消息队列第一步这中间截获消息。

此时,我们安装特定消息的钩子(鼠标消息,键盘消息等),我们安装钩子之后,便可以选择自定义处理或者让其消息继续正常往下传递。

/*
HOOK(钩子)
(1) 进程内的钩子
(2) 全局钩子
Windows消息机制
*/

//CUI main
//GUI WinMain
#include <Windows.h>

//1,应用程序实例句柄类型  表示当前的应用程序
//2,兼容16位应用程序 NULL
//3,命令行参数  char * 
//4,窗口显示的方式  最大化
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

//鼠标钩子处理函数
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);

//鼠标钩子句柄
HHOOK g_mousethook;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hProInstance,
	LPSTR lpCmdLine,int nCmdShow)
{
	//1,设计窗口类
	TCHAR szAppClassName[] = TEXT("GoingJack");
	WNDCLASS wndClass = { 0 };
	wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//加载白色画刷
	wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);		//当前的鼠标
	wndClass.hInstance = hInstance;						//当前的句柄
	wndClass.lpfnWndProc = WindowProc;
	wndClass.lpszClassName = szAppClassName;
	wndClass.style = CS_HREDRAW | CS_VREDRAW;
	//2,注册窗口类
	RegisterClass(&wndClass);
	//3,创建窗口
	HWND hWnd = CreateWindow(szAppClassName, TEXT("HOOK编程"),
		WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX,
		500, 200, 800, 600, NULL, NULL, hInstance, NULL);
	//4,显示和更新窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	//5,消息循环
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//处理消息  将虚拟键的消息转化位字符消息 上键 VK_UP
		TranslateMessage(&msg);
		//将消息分发给窗口处理函数
		DispatchMessage(&msg);
	}
}

//1,设计窗口类
	//2,注册窗口类
	//3,创建窗口
	//4,显示和更新窗口
	//5,消息循环

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_CREATE:
		g_mousethook =  SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId());
		break;
	case WM_CLOSE:
		DestroyWindow(hWnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hWnd, TEXT("你好世界"), TEXT("温馨提示"), MB_OK);
		break;
	case WM_RBUTTONDOWN:
		SetWindowText(hWnd, TEXT("修改"));
		break;
	case WM_MOUSEMOVE:
	{
		int x = LOWORD(lParam);
		int y = HIWORD(lParam);
		wchar_t str[100];
		wsprintf(str, TEXT("当前坐标(%d,%d)"), x, y);

		SetWindowText(hWnd, str);
		break;
	}
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//HOOK
//1,截获处理
//2,不处理

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	return CallNextHookEx(g_mousethook, nCode, wParam, lParam);
	//return 1;//返回非0;表示对这个消息进行处理,这样的化系统不对这个消息传递了
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值