VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 408|回复: 1

VC++高级班之窗口篇-[8]模拟鼠标、键盘操作

[复制链接]
01_avatar_middle
online_admins admin 发表于 2018-2-26 00:19:58 | 显示全部楼层 |阅读模式
------------------------------------------ Begin ----------------------------------------
①、鼠标点击之发消息方式:
  1. //对话框右键单击
  2. HWND hDlgWnd = ::FindWindow(_T("#32770"), _T("MsgTest"));
  3. if (hDlgWnd){
  4.         ::PostMessage(hDlgWnd, WM_RBUTTONDOWN, MK_RBUTTON, MAKELPARAM(20, 20));
  5.         ::PostMessage(hDlgWnd, WM_RBUTTONUP, 0, MAKELPARAM(20, 20));
  6. }
复制代码

  1. //鼠标左键单击按钮
  2. HWND hDlgWnd = ::FindWindow(_T("#32770"), _T("MsgTest"));
  3. if (hDlgWnd){
  4.         ::ShowWindow(hDlgWnd, SW_NORMAL);
  5.         ::SetForegroundWindow(hDlgWnd);
  6.         HWND hBtn = ::GetDlgItem(hDlgWnd, 0x3E8);
  7.         ::SendMessage(hBtn, BM_CLICK, 0, 0);
  8. }
复制代码

  1. //另一种单击按钮的实现
  2. HWND hDlgWnd = ::FindWindow(_T("#32770"), _T("MsgTest"));
  3. if (hDlgWnd){
  4.         ::ShowWindow(hDlgWnd, SW_NORMAL);
  5.         ::SetForegroundWindow(hDlgWnd);
  6.         HWND hBtn = ::GetDlgItem(hDlgWnd, 0x3E8);
  7.         ::PostMessage(hBtn, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(10, 10));
  8.         ::PostMessage(hBtn, WM_LBUTTONUP, 0, MAKELPARAM(10, 10));
  9. }
复制代码

===================================================
②、鼠标点击之 mouse_event 方式:
  1. HWND hDlgWnd = ::FindWindow(_T("#32770"), _T("MsgTest"));
  2. if (hDlgWnd){
  3.         ::ShowWindow(hDlgWnd, SW_NORMAL);
  4.         ::SetForegroundWindow(hDlgWnd);
  5.         HWND hBtn = ::GetDlgItem(hDlgWnd, 0x3E8);
  6.         CRect mRect;
  7.         ::GetWindowRect(hBtn, &mRect);
  8.         SetCursorPos(mRect.left+3, mRect.top+3);

  9.         mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  10.         Sleep(100);
  11.         mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  12. }
复制代码


===================================================
③、程序是死的人的活的,以上两种方法不行的话,还有第三种:
  1. //快捷键方式:
  2. HWND hDlgWnd = ::FindWindow(_T("KugouMainPlayer"), NULL);
  3. if (hDlgWnd){
  4.         ::ShowWindow(hDlgWnd, SW_NORMAL);
  5.         ::SetForegroundWindow(hDlgWnd);
  6.         keybd_event(VK_F5, 0, 0, 0);
  7.         Sleep(100);
  8.         keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);
  9. }
复制代码

       
  1. //全局热键方式:
  2. HWND hDlgWnd = ::FindWindow(_T("KugouMainPlayer"), NULL);
  3. if (hDlgWnd){
  4.         keybd_event(VK_CONTROL, 0, 0, 0);
  5.         keybd_event(VK_MENU, 0, 0, 0);
  6.         keybd_event(VK_F5, 0, 0, 0);
  7.         Sleep(100);
  8.         keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);
  9.         keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
  10.         keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  11. }
复制代码

===================================================
④、用 keybd_event 模拟字符输入:
  1. #define IsKeyPressed(nVirtKey)  ((GetKeyState(nVirtKey) & (1<<(sizeof(SHORT)*8-1))) != 0)
  2. #define IsKeyToggled(nVirtKey)  ((GetKeyState(nVirtKey) & 1) != 0)
复制代码

  1. void CDlgTestDlg::OnBnClickedBtn()
  2. {
  3.         HWND hNotepad = ::FindWindow(_T("Notepad"), _T("无标题 - 记事本"));
  4.         ::ShowWindow(hNotepad, SW_NORMAL);
  5.         ::SetForegroundWindow(hNotepad);

  6.         BOOL bToggled = IsKeyToggled(VK_CAPITAL);
  7.         if (bToggled) {
  8.                 keybd_event( VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY, 0);
  9.                 Sleep(20);
  10.                 keybd_event( VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  11.         }

  12.         CString strOut(_T("AbCd"));
  13.         for (int idx = 0; idx < strOut.GetLength(); idx++)
  14.         {
  15.                 TCHAR ch = strOut.GetAt(idx);
  16.                 if (_istlower(ch)) {
  17.                         keybd_event(_totupper(ch), 0, 0, 0);
  18.                         Sleep(20);
  19.                         keybd_event(_totupper(ch), 0, KEYEVENTF_KEYUP, 0);
  20.                 }else{
  21.                         keybd_event(VK_SHIFT, 0, 0, 0);
  22.                         keybd_event(ch, 0, 0, 0);
  23.                         Sleep(20);
  24.                         keybd_event(ch, 0, KEYEVENTF_KEYUP, 0);
  25.                         keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
  26.                 }
  27.                 Sleep(50);
  28.         }

  29.         if (bToggled) {
  30.                 keybd_event( VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY, 0);
  31.                 Sleep(20);
  32.                 keybd_event( VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  33.         }
  34. }
复制代码


keybd_event 第一个参数传递大写字母,实际输入小写字母;
keybd_event 第一个参数传递小写字母,实际输出对应的数字,是不正确的

所以,传进小写字母,并且要显示小写字母,就要转换到大写字母进行传入,
传进大写字母,并且要显示大写字母,要借助于 Shift 键+大写字母进行传入
===================================================
⑤、SendInput 方式:
Windows NT/2000/XP/Vista/7 及以后的操作系统中,微软不建议使用 mouse_event、keybd_event 等模拟鼠标、键盘事件的 API 函数,
建议的方式是使用 SendInput 函数:

  1. HWND hDlgWnd = ::FindWindow(_T("KugouMainPlayer"), NULL);
  2. if (hDlgWnd){
  3.         INPUT iPut[6] = {0};
  4.         iPut[0].type = iPut[1].type = iPut[2].type = iPut[3].type = iPut[4].type = iPut[5].type = INPUT_KEYBOARD;

  5.         iPut[0].ki.wVk = iPut[5].ki.wVk = VK_CONTROL;
  6.         iPut[1].ki.wVk = iPut[4].ki.wVk = VK_MENU;
  7.         iPut[2].ki.wVk = iPut[3].ki.wVk = VK_F5;

  8.         iPut[3].ki.dwFlags = iPut[4].ki.dwFlags = iPut[5].ki.dwFlags = KEYEVENTF_KEYUP;
  9.         iPut[0].ki.time = iPut[1].ki.time = iPut[2].ki.time = GetTickCount();
  10.         Sleep(100);
  11.         iPut[3].ki.time = iPut[4].ki.time = iPut[5].ki.time = GetTickCount();

  12.         SendInput(sizeof(iPut)/sizeof(iPut[0]), iPut, sizeof(INPUT));
  13. }
复制代码

===================================================
※※※ 小作业:使用 SendInput 函数模拟鼠标按键消息!
------------------------------------- End -------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:https://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:https://www.cctry.com/static/vip/index.html




上一篇:VC++高级班之窗口篇-[7]打造自己的星号密码查看器
下一篇:VC++高级班之窗口篇-[9]为窗口添加信息提示功能

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 22:54

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表