浅谈外挂编程之模拟键盘鼠标

1、前台模拟鼠标键盘操作

这里将窗口置顶,再调用模拟键鼠操作相关的API,微软提供了一个API,例如:

SetWindowPos(this->GetSafeHwnd(),HWND_TOPMOST, cx, cy, 0, 0, SWP_NOSIZE);

但是这个API也不能确保当前窗口就是最顶层(因为另一个程序再次调用的时候会覆盖)

为了确保当前窗口在最顶层,下面是我整理后的代码,实例代码如下:

激活窗口:

  1. void CMFCDlg::OnBtnActivewindow()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     CString strCaption = _T("水晶连连看");     
  5.     CWnd*   pwndFirst  = CWnd::FindWindow(NULL,strCaption);     
  6.     if(pwndFirst)     
  7.     {     
  8.         CWnd*   pwndPopup = pwndFirst->GetLastActivePopup();     
  9.         pwndFirst->SetForegroundWindow();     
  10.         pwndFirst->ShowWindow(SW_SHOWNORMAL);     
  11.         if(pwndFirst   !=   pwndPopup)     
  12.         {  
  13.             pwndPopup->SetForegroundWindow();   
  14.             ::SendMessage((HWND__ *)pwndPopup, WM_SYSKEYDOWN,VK_MENU,0);  
  15.             ::SendMessage((HWND__ *)pwndPopup, WM_SYSKEYDOWN,VK_F4,0); //按下f4   
  16.               
  17.             ::SendMessage((HWND__ *)pwndPopup, WM_SYSKEYUP,VK_MENU,0);  
  18.             ::SendMessage((HWND__ *)pwndPopup, WM_SYSKEYUP,VK_F4,0);   
  19.         }   
  20.     }     
  21. }  

模拟按键:

  1. void Output()  
  2. {  
  3.     // 模拟 Ctrl + V 按下  
  4.     keybd_event(VK_CONTROL, 0, 0, 0);    
  5.     keybd_event('V', 0, 0, 0);  
  6.       
  7.     // 模拟 Ctrl + V 弹起  
  8.     keybd_event('V', 0, KEYEVENTF_KEYUP, 0);    
  9.     keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);    
  10.       
  11.     // 模拟 Alt + S 按下  
  12.     keybd_event(VK_MENU, 0, 0, 0);  
  13.     keybd_event('S', 0, 0, 0);   
  14.     // 模拟 Enter 按下弹起  
  15.     keybd_event(VK_RETURN, 0, 0, 0);  
  16.     keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);    
  17.     Sleep(10);  
  18.       
  19.     // 模拟 Alt + S 弹起  
  20.     keybd_event('S', 0, KEYEVENTF_KEYUP, 0);   
  21.     keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);    
  22.     // 模拟 Enter 按下  
  23.     keybd_event(VK_RETURN,0,0,0);  
  24.     Sleep(10);  
  25. }  

模拟鼠标点击:

  1. void CLinkDlg::OnTest()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     CString gameCaption="水晶连连看";  
  5.     HWND    hWnd=::FindWindow(NULL,gameCaption);  
  6.     DWORD   dwPid;  
  7.     RECT    rect;  
  8.     POINT   ptOld;  
  9.     // 获取窗口句柄、当前窗口的位置(相对桌面屏幕)  
  10.     ::GetWindowThreadProcessId(hWnd,&dwPid);  
  11.     ::GetWindowRect(hWnd,&rect);  
  12.     // 获取旧的鼠标位置、设置新的位置  
  13.     ::GetCursorPos(&ptOld);  
  14.     ::SetCursorPos(80,150);  
  15.     // 在新的位置点击鼠标左键  
  16.     mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
  17.     mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);  
  18.     // 在第二点点击鼠标左键  
  19.     SetCursorPos(rect.left +200,rect.top +150);  
  20.     mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
  21.     mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);  
  22. }  


2、后台模拟鼠标键盘操作

这里就不需要激活窗口了,这就类似传说中XX脱机外挂,还是参见代码吧!

后台模拟键盘事件:

  1. void CTestDlg::PressF5()  
  2. {  
  3.     HWND    hWnd = ::FindWindow(NULL,_T("水晶连连看"));  
  4.     if(!hWnd)  
  5.     {  
  6.         MessageBox("请先运行水晶连连看主程序","提示",MB_OK | MB_ICONERROR);  
  7.         return;  
  8.     }  
  9.       
  10.     // 下面是后台模拟按下回车键与F5  
  11.     ::PostMessage(hWnd,WM_KEYDOWN,VK_RETURN,0);  
  12.     ::PostMessage(hWnd,WM_KEYUP,VK_RETURN,0);  
  13.       
  14.     ::PostMessage(hWnd,WM_KEYDOWN,VK_F5,0);  
  15.     ::PostMessage(hWnd,WM_KEYUP,VK_F5,0);  
  16.       
  17.     ::PostMessage(hWnd,WM_KEYDOWN,VK_RETURN,0);  
  18.     ::PostMessage(hWnd,WM_KEYUP,VK_RETURN,0);  
  19. }  

后台模拟鼠标点击:

在测试这段代码时,我查找了很多资料未果,因为最后一个参数LPARAM我尝试过很多方法去表示鼠标的坐标也不行,终于在codeproject一位朋友告诉我用MAKELPARAM宏来设置鼠标X、Y的坐标,在此深表感谢!

  1. void CTestDlg::MouseClick()  
  2. {  
  3.     CString gameCaption="水晶连连看";  
  4.     HWND    hWnd=::FindWindow(NULL,gameCaption);  
  5.     // 模拟点击主窗口相对坐标(80,130)的位置  
  6.     ::PostMessage(hWnd,WM_MOUSEMOVE, MK_LBUTTON, MAKELONG(80,130));  
  7.     ::PostMessage(hWnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(80,130));     
  8.     ::PostMessage(hWnd,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(80,130));  
  9.     Sleep(10);  
  10. }  

相关工程的源代码就不用上传了吧,有兴趣的自己摸索一下~~~

你可能感兴趣的:(编程)