C++获取鼠标位置及全局检测鼠标行为
2015-12-13 22:52
549 查看
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++类的外部
2>、在构造函数中初始化
3>、在初始化函数中安装Hook
4>、在析构函数中添加
5>、 在当前cpp的类外中定义声明的三个函数
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(); //卸载 BOOLInstallHook(); //安装
2>、在构造函数中初始化
mouse_Hook=NULL; //将钩子NULL
3>、在初始化函数中安装Hook
InstallHook()
4>、在析构函数中添加
UninstallHook()
5>、 在当前cpp的类外中定义声明的三个函数
BOOL InstallKbHook( ) { if (mouse_Hook) UninstallHook(); mouse_Hook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)(LowLevelMouseProc), AfxGetApp()->m_hInstance, NULL); return( mouse_Hook != NULL); } BOOL UninstallHook() { BOOL jud = FALSE; if (mouse_Hook) { jud= UnhookWindowsHookEx(mouse_Hook ); mouse_Hook = NULL; //set NULL } return jud; } LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam) { CPoint _mousepoint; MSLLHOOKSTRUCT *pkbhs = (MSLLHOOKSTRUCT *)lParam; switch (nCode) { case HC_ACTION: { //鼠标左击 if(wParam == WM_LBUTTONDOWN||wParam == WM_RBUTTONDOWN||wParam == WM_MBUTTONDOWN||wParam ==WM_LBUTTONUP||wParam ==WM_RBUTTONUP||wParam == WM_MBUTTONUP){ //获取鼠标的位置,并进行必要的判断 //鼠标右键按下 if(Mmdlg!=NULL){ if( Mmdlg->setingmenu!=NULL&& Mmdlg->bo_back!=1) { //如果鼠标不在当前客户端位置之内 GetCursorPos(&_mousepoint); CRect m_crect; //Mmdlg->setingmenu->GetClientRect(m_crect); Mmdlg->setingmenu->GetWindowRect(m_crect); //ScreenToClient(Mmdlg->setingmenu->m_hWnd,&m_crect); if(m_crect.bottom>_mousepoint.y && m_crect.top<_mousepoint.y && m_crect.left<_mousepoint.x && m_crect.right >_mousepoint.x ){ ; //啥也不干 } else{ delete [] Mmdlg->setingmenu; Mmdlg->setingmenu=NULL; } } Mmdlg->bo_back=0; } } } default: break; } return CallNextHookEx (NULL, nCode, wParam, lParam); }
相关文章推荐
- C语言循环总结以及实例讲解
- Interpreter(解释器)设计模式
- 带你玩转Visual Studio——带你了解VC++各种类型的工程
- c++多个源文件共用一个全局变量(extern 的用法)
- c++中类对象不能访问类的私有成员变量
- C++学生成绩排序
- C语言基础(二)
- C语言程序练习
- 创建二叉排序树并查找值为x的节点(c语言版)
- 【C++】计算所有小于N的勾股数组合,可以写入txt文件保存,每组占一行。
- 实战c++中的string系列--函数返回局部变量string(引用局部string,局部string的.c_str()函数)
- 实战c++中的string系列--函数返回局部变量string(引用局部string,局部string的.c_str()函数)
- C++ 策略模式
- CPP 6th——运算符重载+函数重载+函数模板
- 关于c++提取符号“>>”的重载问题
- C语言知识总结
- c语言总结
- g++编译c++文件
- C语言总结
- C语言中指针