//以下代码定义了一个简单的进程鼠标移动事件钩子
详细内容参考链接:
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;表示对这个消息进行处理,这样的化系统不对这个消息传递了
}