241上位机VC MFC实现鼠标位置获取及鼠标操作模拟常用功能
241上位机VC MFC实现鼠标位置获取及鼠标操作模拟常用功能 功能展示 鼠标是用户与我们编写好的上位机程序交互的常用工具,因此程序对鼠标的状态获取也会是一种常用的功能,我们当前例程实现鼠标当前位置获取,鼠标左右键切换,鼠标模拟用户操作,鼠标移动与双击范围等与鼠标相关常用的功能,效果如图; 要点提示 我们当前例程实现与鼠标相关的常用的小功能。 一.其中鼠标左右键交换可以用函数SwapMouseButton()函数跟随一BOOL类型参数,为TRUE执行鼠标左右键交换,为FALSE恢复左右的交换; 二.鼠标各种操作的模拟可以用函数mouse_event(); 函数原型为 VOID mouse_event(DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData,ULONG_PTR dwExtraInfo ); 参数说明: 1.dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合: MOUSEEVENTF_ABSOLUTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分: MOUSEEVENTF_MOVE:表明发生移动。 MOUSEEVENTF_LEFTDOWN:表明接按下鼠标左键。 MOUSEEVENTF_LEFTUP:表明松开鼠标左键。 MOUSEEVENTF_RIGHTDOWN:表明按下鼠标右键。 MOUSEEVENTF_RIGHTUP:表明松开鼠标右键。 MOUSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。 MOUSEEVENTF_MIDDLEUP:表明松开鼠标中键。 MOUSEEVENTF_WHEEL:在WindowsNT中如果鼠标有一个轮,表明鼠标轮被移动。移动的数量由dwData给出 2.dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。 3.dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。 4.dwData:如果dwFlags为MOUSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。如果dwFlagsS不是MOUSEEVENTF_WHEEL,则dWData应为零。 dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessageExtraInfo来获得此附加信息。 实现功能 1.新建基于对话框的应用程序 2.拖拽按钮<检测鼠标有/无安装><检测鼠标支持按键个数><检测鼠标是否有滚轮><检测鼠标左右键交换><执行鼠标左右键交换><模仿鼠标点击标题栏>检测鼠标位置<检测鼠标移动范围><检测鼠标双击范围><检测鼠标双击响应速度>关联函数 - void CGkbc8Dlg::OnButton1() //检测鼠标有/无安装
- {
- if(::GetSystemMetrics(SM_MOUSEPRESENT))
- MessageBox("系统已经安装鼠标","信息提示",MB_OK);
- else
- MessageBox("系统没有安装鼠标","信息提示",MB_OK);
- }
- void CGkbc8Dlg::OnButton2() //检测鼠标按键个数
- {
- CString sNum;
- sNum.Format("鼠标支持有:%d 个键",GetSystemMetrics(SM_CMOUSEBUTTONS));
- MessageBox(sNum,"信息提示",MB_OK);
- }
- void CGkbc8Dlg::OnButton3() //检测鼠标是否有滚轮
- {
- if(::GetSystemMetrics(SM_MOUSEWHEELPRESENT))
- MessageBox("鼠标安装有滚轮","信息提示",MB_OK);
- else
- MessageBox("鼠标没有安装滚轮","信息提示",MB_OK);
- }
- void CGkbc8Dlg::OnButton7() //获取鼠标位置
- {
- SetTimer(5,500,NULL);
- }
复制代码3.添加定时器函数:并在stdafx.h头文件顶部提升窗口版本 #define WINVER 0x0500 - void CGkbc8Dlg::OnTimer(UINT nIDEvent)
- {
- if(1==nIDEvent)
- {
- KillTimer(1);
- CRect rc;
- GetWindowRect(&rc);
- SetCursorPos(rc.left+50, rc.top +10);
- SetTimer(2,500,NULL);
- }
- if(2==nIDEvent)
- {
- KillTimer(2);
- mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模拟鼠标右键按下
- mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模拟鼠标右键放开
- SetTimer(3,500,NULL);
- }
- if(3==nIDEvent)
- {
- KillTimer(3);
- mouse_event(MOUSEEVENTF_MOVE,20,40,0,0);
- SetTimer(4,500,NULL);
- }
- if(4==nIDEvent)
- {
- KillTimer(4);
- mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
- mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
- }
- if(5==nIDEvent)//鼠标位置获取
- {
- CPoint pt;
- GetCursorPos(&pt);
- CString sMousePos;
- sMousePos.Format("鼠标当前位置:X=%d,Y=%d",pt.x,pt.y);
- SetDlgItemText(IDC_BUTTON7,sMousePos);
- }
- CDialog::OnTimer(nIDEvent);
- }
复制代码我们来演示下功能实现的整个过程
|