首页 > 其他分享 >VC 模拟鼠标和键盘输入

VC 模拟鼠标和键盘输入

时间:2022-11-24 16:46:11浏览次数:68  
标签:VC MOUSEEVENTF 鼠标 val 键盘输入 pwnd mouse event

模拟鼠标点击:

1、这里是鼠标左键按下和松开两个事件的组合即一次单击: 

mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 

2、模拟鼠标右键单击事件: 
mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 ) 

3、两次连续的鼠标左键单击事件 构成一次鼠标双击事件: 
mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 
mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 

4、使用绝对坐标 
MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0 

需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点--直接设定绝对坐标并单击 
mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0); 
mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0); 

其中X,Y分别是你要点击的点的横坐标和纵坐标 

 

模拟键盘输入:

  void EnterString(const char* text)   {   bool bShift = false;   size_t length = strlen(text);   for(size_t index = 0;index < length;index++)   {   int val = text[index];   if(val >= 97 && val <= 122) //小写a-z   {   val -= 32;   bShift = false;   }   else if(val >= 65 && val <= 90) //大写A-Z   {   bShift = true;   }   else if(val >= 48 && val <= 57) //数字0-9   {   bShift = false;   }   else //特殊符号   {   switch(val)   {   case '`':   val = 192;   bShift = false;   break;   case '~':   val = 192;   bShift = true;   break;   case '!':   val = '1'; //!和1在同一个键盘,使用同一个键盘码,以下相同   bShift = true;   break;   case '@':   val = '2'; //@和2在同一个键盘,使用同一个键盘码,以下相同   bShift = true;   break;   case '#':   val = '3';   bShift = true;   break;   case '$':   val = '4';   bShift = true;   break;   case '%':   val = '5';   bShift = true;   break;   case '^':   val = '6';   bShift = true;   break;   case '&':   val = '7';   bShift = true;   break;   case '*':   val = '8';   bShift = true;   break;   case '(':   val = '9';   bShift = true;   break;   case ')':   val = '0';   bShift = true;   break;   case '-':   val = 189;   bShift = false;   break;   case '=':   val = 187;   bShift = false;   break;   case '_':   val = 189;   bShift = true;   break;   case '+':   val = 187;   bShift = true;   break;   case '[':   val = 219;   bShift = false;   break;   case '{':   val = 219;   bShift = true;   break;   case ']':   val = 221;   bShift = false;   break;   case '}':   val = 221;   bShift = true;   break;   case '\\':   val = 220;   bShift = false;   break;   case '|':   val = 220;   bShift = true;   break;   case ';':   val = 186;   bShift = false;   break;   case ':':   val = 186;   bShift = true;   case '\'':   val = 222;   bShift = false;   break;   case '\"':   val = 222;   bShift = true;   break;   case ',':   val = 188;   bShift = false;   break;   case '<':   val = 188;   bShift = true;   break;   case '.':   val = 190;   bShift = false;   break;   case '>':   val = 190;   bShift = true;   break;   case '/':   val = 191;   bShift = false;   break;   case '?':   val = 191;   bShift = true;   break;   default:   break;   }   }       if(bShift)   keybd_event(VK_SHIFT,0,0,0);   keybd_event(val,0,0,0);   keybd_event(val,0,KEYEVENTF_KEYUP,0);   if(bShift)   keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);   }   }   但是要注意,如果用户默认是中文输入法,那我们得先想办法切换到英文输入法才行。

到网上看到一篇文章,说的是在WinCE下的法:

http://www.cnblogs.com/iVincentFeng/archive/2010/04/20/KeyboardInputSimulation_SendMessage_keybd_event_PostKeybdMessage.html

但是后来发现,如果我们想写入中文字符,怎么办呢??

我开始的思路是像控制输入法的切换状态,来实现。。。 其实,我们只需找到我们需要输入的控件,然后填入中文字符就行了。

我用"按键精灵"找到控件的名称等相关信息,然后用下面的代码来遍历,之后填充数据即可。

  wchar_t sPath[]=_T("niha风范股份围观");   CWnd * pWnd = FindWindow(NULL,_T("另存为"));   CString sCtrlName;   CWnd *pedit;   CString filename;   wchar_t *buf=new wchar_t[512];       if(pWnd)   {   CWnd *pwnd=pWnd->GetWindow(GW_CHILD);//枚举保存对话框的所有子控件       while(pwnd!=NULL)   {   ::GetClassName(pwnd->GetSafeHwnd(),buf,512);//得到枚举的控件是什么类型的,   CString str=buf;   str.TrimRight();   if(str==_T("ComboBoxEx32"))//如果枚举到保存文件名的EDIT   {   pedit=pwnd;//保存EDIT句柄用来发消息   pwnd->SendMessage(WM_SETTEXT,sizeof(sPath)/sizeof(wchar_t),(LPARAM)(void*)sPath);   UpdateData(FALSE);   break;   }   pwnd = pwnd->GetNextWindow();   }       }   delete [] buf;       SetCursorPos(512+r2.left,366+r2.top);//按钮【保存】   mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
 
 

想想,如果把坐标的操作全部转化为控件指针来处理,也许更安全,这样,不管客户那边的分辨率和中途改变窗口,我们的操作依然正确。

 

下面是附带的一点代码:

  if(str=="保存(&S)")//如果是保存按钮   {   lstrcpy(BUF,(LPCTSTR)sPath);//sPath表示我们要设置的对话框浏览目录   //发消息设置文件名EDIT为我们的路径名,完成第二步   pedit->SendMessage(WM_SETTEXT,0,(LPARAM)BUF);   //发消息模拟点击保存按钮,完成第三步   ::SendMessage(pwnd->GetSafeHwnd(),WM_LBUTTONDOWN,0,0);   ::SendMessage(pwnd->GetSafeHwnd(),WM_LBUTTONUP,0,0);   }
 
  //发消息还原EDIT里的文件名,完工!   pedit->SendMessage(WM_SETTEXT,0,(LPARAM)filename);
 
 

附带一个链接,自认为比较好的一篇文章:点击打开链接

OK ,就此为止,有什么不正确的地方,欢迎大家指正,共同进步..!!!微笑

 

 

 

标签:VC,MOUSEEVENTF,鼠标,val,键盘输入,pwnd,mouse,event
From: https://www.cnblogs.com/lidabo/p/16922339.html

相关文章

  • PowerCli批量管理多个vCenter
    实测软件平台版本VMwarevSphere:7.0u3/6.7u3混合VMwareESXi:7.0u3/6.7u3混合Powershell:5.1.17763.2090VMwarePowercli:12.7.0-20091289使用场景:多版本共存环境;管......
  • unity 实现鼠标悬停显示物品信息
    主要用到委托和事件C#委托官网API:event:Link委托:Link鼠标事件方法,需要继承这两个接口IPointerEnterHandler,IPointerExitHandler从而生成以下两个方法OnPointerEnter(......
  • C++ 模拟鼠标键盘操作
     文章目录1、简介2、GetAsyncKeyState2.1函数声明2.2宏定义2.3代码示例3.GetKeyState3.1函数声明3.2宏定义4、mouse_event4.1函数声明4.2......
  • 【Win32 API学习】模拟键盘输入和鼠标输入
    在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂的,或重复性的输入操作,我们能否通过编......
  • Spring —— SpringMVC简介
    SpringMVCSpringMVC技术与Servlet技术功能等同,均属于web层开发技术是一种基于java实现MVC模型的轻量级Web框架 SpringMVC入门案例           ......
  • C语言在控制台上实现鼠标操作的方法
     文章目录了解windows库函数了解句柄实现思路与代码在制作面向用户系统时,我们往往需要设置除输入参数外更为灵活的操作方式,例如鼠标点击、按键按下(无阻塞输入)......
  • myos3 大学生利用C++构建一个完整的操作系统之代码重构并实现键盘打字和鼠标移动
    ​​myos1大学生利用C++构建一个完整的操作系统打印helloworld​​myos2大学生利用C++构建一个完整的操作系统之响应键盘中断myos3大学生利用C++构建一个完整的操作系统......
  • QT图片查看器封装-鼠标中心缩放、移动、截图、框选、切换播放
    Qt图片查看器目录1      简介...12      功能实现...22.1     图片以鼠标为中心放大缩小功能...22.2     图片移动功能...42.3   ......
  • Spring mvc
    SpringMVCMVC:模型(daoservice)视图jsp控制器ServletSpringMVC的特点:轻量级,简单易学高效,基于请求响应的MVC框架与Spring兼容性好,无缝结合约定优于配置功能强......
  • vconsole h5调试工具
    1.效果如图 2. 安装 $npminstallvconsole3.在项目中使用 只需要在你的main.js中写入一段代码  if(process.env.NODE_ENV!=="production"){co......