C++获取鼠标位置及全局检测鼠标行为
1、获取鼠标位置(在屏幕的位置)
CPoint m_mouse;
GetCursorPos(&m_mouse);
2、 屏幕转化为客户端(控件的相对位置)& 客户端位置转化为屏幕位置
ClientToScreen(this->m_hwnd,m_mouse); //客户端位置转化为屏幕位置
ScreenToClient(this->m_hwnd,m_mouse) ; //屏幕转化为客户端
3、获取控件关于在屏幕的位置
CRect rc
GetWindowRect(&rc);
4、检测鼠标的action的方式多,自己用的多的是msdn上介绍的callback的鼠标钩子(低级钩子)函数来实现
1> 、对鼠标进行的几个全局变量进行声明:
将这部分放置在C++类的外部
/* 全局变量和全局函数定义 设定一个鼠标低级钩子变量 */ HHOOK mouse_Hook ; LRESULT CALLBACK LowLevelMouseProc ( INT nCode, WPARAM wParam, LPARAM lParam ); BOOL UninstallHook(); //卸载 BOOL InstallHook(); //安装
2>、在构造函数中初始化
1 mouse_Hook=NULL; //将钩子NULL
3>、在初始化函数中安装Hook
1 InstallHook()
4>、在析构函数中添加
UninstallHook()
5>、 在当前cpp的类外中定义声明的三个函数
1 BOOL InstallKbHook( ) 2 { 3 4 if (mouse_Hook) UninstallHook(); 5 mouse_Hook = SetWindowsHookEx(WH_MOUSE_LL, 6 (HOOKPROC)(LowLevelMouseProc), AfxGetApp()->m_hInstance, NULL); 7 8 return( mouse_Hook != NULL); 9 } 10 11 BOOL UninstallHook() 12 { 13 14 BOOL jud = FALSE; 15 if (mouse_Hook) { 16 jud= UnhookWindowsHookEx(mouse_Hook ); 17 mouse_Hook = NULL; //set NULL 18 } 19 20 return jud; 21 } 22 23 LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam) 24 { 25 CPoint _mousepoint; 26 MSLLHOOKSTRUCT *pkbhs = (MSLLHOOKSTRUCT *)lParam; 27 switch (nCode) 30 { 31 32 case HC_ACTION: 33 { 34 //鼠标左击 35 if(wParam == WM_LBUTTONDOWN||wParam == WM_RBUTTONDOWN||wParam == WM_MBUTTONDOWN||wParam ==WM_LBUTTONUP||wParam ==WM_RBUTTONUP||wParam == WM_MBUTTONUP){ 36 //获取鼠标的位置,并进行必要的判断 37 38 //鼠标右键按下 39 if(Mmdlg!=NULL){ 40 if( Mmdlg->setingmenu!=NULL&& Mmdlg->bo_back!=1) 41 { 42 //如果鼠标不在当前客户端位置之内 43 GetCursorPos(&_mousepoint); 44 CRect m_crect; 45 //Mmdlg->setingmenu->GetClientRect(m_crect); 46 Mmdlg->setingmenu->GetWindowRect(m_crect); 47 //ScreenToClient(Mmdlg->setingmenu->m_hWnd,&m_crect); 48 if(m_crect.bottom>_mousepoint.y && m_crect.top<_mousepoint.y && 49 m_crect.left<_mousepoint.x && m_crect.right >_mousepoint.x 50 ){ 51 ; //啥也不干 52 } 53 else{ 54 delete [] Mmdlg->setingmenu; 55 Mmdlg->setingmenu=NULL; 56 } 57 } 58 Mmdlg->bo_back=0; 59 } 60 } 61 } 62 default: break; 63 } 64 65 return CallNextHookEx (NULL, nCode, wParam, lParam); 66 }
编程是一种快乐,享受代码带给我的乐趣!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决