Windows消息机制,HOOK编程

Windows消息机制,HOOK编程Hook 钩子 1 进程内钩子 2 全局钩子 Windows 消息机制 include Windows h include wingdi h HWNDhWnd 窗口句柄 HHOOKg mouseHook 钩子函数句柄 HHOOKg keyboarHook 键盘钩子函数句柄 窗口处理函数 LRESULTCALLB HWNDhwnd UINTuMsg WPARAMwP wingdi h Windows h

/* *Hook(钩子): *(1)进程内钩子 *(2)全局钩子 *Windows消息机制: */ #include  
     #include  
     HWND hWnd; //窗口句柄 HHOOK g_mouseHook; //钩子函数句柄 HHOOK g_keyboarHook; //键盘钩子函数句柄 //窗口处理函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //鼠标钩子处理函数 LRESULT CALLBACK MouseProc(int nCod, WPARAM wParam, LPARAM lParam); //键盘钩子处理函数 LRESULT CALLBACK KeyboardProc(int nCod, WPARAM wParam, LPARAM lParam); /* CUI:控制台应用程序=>main GUI:图形界面=>WinMain */ //HINSTANCE:应用程序实例句柄类型 //LPSTR:char*命令行参数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR IpCmdLine, int nCmdShow) { 
    //①设计窗口类 TCHAR szAppClassName[] = TEXT("TEST");//TEXT:字符宏,自动适应字符集 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; //窗口类的风格 //②注册窗口类 RegisterClass(&wndClass); //③创建窗口,返回窗口句柄 hWnd = CreateWindow(szAppClassName, TEXT("窗口标题"), WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MINIMIZEBOX, 500, 200, 600, 400, NULL, NULL, hInstance, NULL); //④显示和更新窗口 ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); //⑤消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) //获取到WM_QUIT消息,返回0,结束循环 { 
    //将虚拟键消息转换为字符消息,键盘上每个键都有一个虚拟键值 TranslateMessage(&msg); //将消息分发给窗口处理函数 DispatchMessage(&msg); } return 0; } /* HWND:窗口句柄,用来区分窗口的 UINT:unsigned int UINT_PTR:UINT_PTR uint指针 LPARAM:LONG_PTR long指针 */ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    PAINTSTRUCT ps; HDC hDC; switch (uMsg) { 
    case WM_CREATE: //窗口创建消息 //安装鼠标钩子 g_mouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId()); //安装键盘钩子 g_keyboarHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId()); break; case WM_CLOSE://窗口关闭消息 DestroyWindow(hwnd); //销毁窗口 break; case WM_DESTROY: //窗口销毁消息 PostQuitMessage(0); break; case WM_PAINT: //窗口绘图消息 { 
    hDC = BeginPaint(hwnd, &ps); HPEN Pen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0)); SelectObject(hDC, Pen); Ellipse(hDC, 0, 0, 200, 200); EndPaint(hwnd, &ps); break; } case WM_LBUTTONDOWN: //鼠标左键按下消息 MessageBox(hwnd, TEXT("弹吉他"), TEXT("温馨提示"), MB_OK | MB_OKCANCEL); break; case WM_RBUTTONDOWN: //鼠标右键按下消息 break; case WM_MOUSEMOVE: //鼠标移动消息 { 
    int x = LOWORD(lParam); //x坐标 int y = HIWORD(lParam); //y坐标 wchar_t str[50]; wsprintf(str, L"当前鼠标坐标(%d,%d)", x, y); SetWindowText(hwnd, str); break; } case WM_KEYDOWN: { 
    MessageBox(hwnd,L"键盘按下",L"提示",MB_OK); break; } default: break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } LRESULT CALLBACK MouseProc(int nCod, WPARAM wParam, LPARAM lParam) { 
    return CallNextHookEx(g_mouseHook,nCod,wParam,lParam); //return 1; //返回非0,表示已经对这个消息进行了处理,这样的话系统不会将这个消息传递给程序了。(屏蔽消息),一般不这样做 } LRESULT CALLBACK KeyboardProc(int nCod, WPARAM wParam, LPARAM lParam) { 
    //屏蔽空格按键和回车键 if (wParam == VK_SPACE||wParam == VK_RETURN) { 
    return 1; } //按F2关闭窗口 if (wParam == VK_F2) { 
    SendMessage(hWnd,WM_CLOSE,0,0); //卸载钩子 UnhookWindowsHookEx(g_mouseHook); UnhookWindowsHookEx(g_keyboarHook); return 1; } return CallNextHookEx(g_keyboarHook, nCod, wParam, lParam); //return 1; //返回非0,表示已经对这个消息进行了处理,这样的话系统不会将这个消息传递给程序了,屏蔽所有按键 } 

https://www.bilibili.com/video/BV1n4411c77j?t=4510

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225193.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午9:53
下一篇 2026年3月17日 上午9:53


相关推荐

  • java executequery_关于Java怎样封装executeQuery()的问题

    java executequery_关于Java怎样封装executeQuery()的问题Java 封装 BaseDao 时经常困扰的一个问题 就是封装 executeQuery 方法的问题 1 如果封装该方法返回一个 ResultSet 对象的话 会出现资源无法释放的尴尬情况 2 如果提前关闭 Connection 对象和 PreparedStat 对象的话返回出去的 ResultSet 对象将会无法使用 3 不释放资源的话虽然可以使用 但是总觉得不舒服为了解决这个问题 试了好久终于发现一个还算

    2026年3月17日
    1
  • java axis_Java 使用Axis实现WebService实例

    java axis_Java 使用Axis实现WebService实例在上一篇WebService实例中,基于jdk1.6以上的javax.jws发布webservice接口。这篇博文则主要用eclipse/myeclipse使用axis插件进行发布和调用WebService。1.下载axis,并解压到tomcat/webapps目录下2.在tomcat部署axis2启动tomcat,可以看到多了个axis2文件在浏览器输入:http://localho…

    2022年7月21日
    15
  • django分页器的用法_MySQL实现数据分页

    django分页器的用法_MySQL实现数据分页前言当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面PageNumberPagination:基础分页器,性能略差LimitOffsetP

    2022年7月30日
    11
  • 5分钟商学院之个人篇–时间管理和学习能力

    1.时间管理1.1时间成本时间成本,就是如果把这个时间用于做别的事情,可以获得的收益懂得计算时间成本,可以帮助我们做出理性决策,比如一件事是自己做合适还是花钱请别人做合适1.2GTD(G

    2021年12月30日
    40
  • 基于Docker部署的RCON远程控制Discord机器人系统

    基于Docker部署的RCON远程控制Discord机器人系统

    2026年3月12日
    3
  • 大数据应用的现实案例

    大数据应用的现实案例互联网企业拥有大量的线上数据,而且数据量还在快速增长,除了利用大数据提升自己的业务之外,互联网企业已经开始实现数据业务化,利用大数据发现新的商业价值。以阿里巴巴为例,它不仅在不断加强个性化推荐、“千人千面”这种面向消费者的大数据应用,并且还在尝试利用大数据进行智能客户服务,这种应用场景会逐渐从内部应用延展到外部很多企业的呼叫中心之中。在面向商家的大数据应用中,以“生意参谋”为例,超过600万商家在利用“生意参谋”提升自己的电商店面运营水平。除了面向自己的生态之外,阿里巴巴数据业务化也在不断加速,

    2022年6月1日
    73

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号