虚拟桌面模拟查找点击自绘控件

// VDesktopClick.cpp : 定义控制台应用程序的入口点。


  1. #include "stdafx.h"  
  2. #include <string>  
  3. #include <Oleacc.h>  
  4. using namespace std;  
  5.   
  6. #define SET_LIST 1  
  7. #define SET_BUT 2  
  8.   
  9. #pragma comment(lib,"Oleacc.lib")  
  10.   
  11. wstring wsTitle = L"title";  
  12. wstring wsAppPath = L"adasd\asdasd\asdasd\asd.exe";  
  13. DWORD dwX = 60;  
  14. DWORD dwY = 20;  
  15.   
  16. /* 
  17. 目的:模拟点击自绘控件,同时不干扰电脑正常工作,也可以理解成不让使用者察觉到。 
  18.  
  19. 测试功能:找到title是wsTitle的窗体,将位置移动到用户看不到的区域,然后以这个窗体为树根,遍历窗体上的所有其他小窗体,目标是找到一个自绘的 
  20. byutton,尺寸是dwX,dwY。的自绘控件,然后模拟一次点击。 
  21.  
  22. 如果界面程序不存在的话就开启一个虚拟桌面,然后在虚拟桌面上去启动这个界面程序,然后模拟。假设界面程序的路径是wsAppPath。 
  23. */  
  24.   
  25.   
  26. void GetObjectName(IAccessible* child,VARIANT* varChild,wchar_t* objName,int len) {  
  27.     BSTR strTmp;  
  28.     HRESULT hr = child->get_accName(*varChild,&strTmp);  
  29.     if(S_OK!=hr) {  
  30.         return;  
  31.     }  
  32.     //_bstr_t str = strTmp;  
  33.     //wchar_t* tmp = str;  
  34.     wchar_t* tmp = strTmp;  
  35.   
  36.     wcscpy_s(objName,MAX_PATH,tmp);  
  37. }  
  38. void GetObjectRole(IAccessible* child,VARIANT* varChild,wchar_t* objRole,int len) {  
  39.     VARIANT pvarRole;  
  40.     DWORD roleId;  
  41.     child->get_accRole(*varChild,&pvarRole);  
  42.   
  43.     if(varChild->vt!=VT_I4) {  
  44.         pvarRole.vt = VT_EMPTY;  
  45.         return /*E_INVALIDARG*/;  
  46.     }  
  47.     roleId = pvarRole.lVal;  
  48.     UINT   roleLength;  
  49.     LPTSTR lpszRoleString;  
  50.   
  51.     // Get the length of the string.  
  52.     roleLength = GetRoleText(roleId,NULL,0);  
  53.   
  54.     // Allocate memory for the string. Add one character to  
  55.     // the length you got in the previous call to make room  
  56.     // for the null character.  
  57.     lpszRoleString = (LPTSTR)malloc((roleLength+1) * sizeof(TCHAR));  
  58.     if(lpszRoleString!=NULL) {  
  59.         // Get the string.  
  60.         GetRoleText(roleId,lpszRoleString,roleLength+1);  
  61.     }  
  62.     wchar_t* tmp = lpszRoleString;  
  63.     wcscpy_s(objRole,MAX_PATH,tmp);  
  64.     free(lpszRoleString);  
  65.     return /*S_OK*/;  
  66.   
  67. }  
  68.   
  69. void GetObjectClass(IAccessible* child,wchar_t* objClass,int len) {  
  70.     HWND htmp;  
  71.     LPTSTR strClass;  
  72.     strClass = (LPTSTR)malloc(MAX_PATH);  
  73.     ::WindowFromAccessibleObject(child,&htmp);  
  74.     if(0==::GetClassName(htmp,strClass,MAX_PATH)) {  
  75.         free(strClass);  
  76.         return;  
  77.     }  
  78.     wchar_t* tmp = strClass;  
  79.     wcscpy_s(objClass,MAX_PATH,tmp);  
  80.     free(strClass);  
  81. }  
  82.   
  83. BOOL Find(IAccessible* paccParent,IAccessible** paccChild) {  
  84.     HRESULT hr;  
  85.     long numChildren;  
  86.     unsigned long numFetched;  
  87.     VARIANT varChild;  
  88.     int indexCount;  
  89.     IAccessible* pCAcc = NULL;  
  90.     IEnumVARIANT* pEnum = NULL;  
  91.     IDispatch* pDisp = NULL;  
  92.     BOOL found = false;  
  93.     wchar_t szObjName[MAX_PATH],szObjRole[MAX_PATH],szObjClass[MAX_PATH],szObjState[MAX_PATH];  
  94.   
  95.     //Get the IEnumVARIANT interface  
  96.     hr = paccParent->QueryInterface(IID_IEnumVARIANT,(PVOID*)&pEnum);  
  97.   
  98.     if(pEnum){  
  99.         pEnum->Reset();  
  100.     }  
  101.   
  102.     // Get child count  
  103.     paccParent->get_accChildCount(&numChildren);  
  104.   
  105.     for(indexCount = 1; indexCount<=numChildren && !found; indexCount++) {  
  106.         pCAcc = NULL;  
  107.         // Get next child  
  108.         if(pEnum)  
  109.             hr = pEnum->Next(1,&varChild,&numFetched);  
  110.         else {  
  111.             varChild.vt = VT_I4;  
  112.             varChild.lVal = indexCount;  
  113.         }  
  114.         // Get IDispatch interface for the child  
  115.         if(varChild.vt==VT_I4) {  
  116.             pDisp = NULL;  
  117.             hr = paccParent->get_accChild(varChild,&pDisp);  
  118.         }  
  119.         else  
  120.             pDisp = varChild.pdispVal;  
  121.         // Get IAccessible interface for the child  
  122.         if(pDisp) {  
  123.             hr = pDisp->QueryInterface(IID_IAccessible,(void**)&pCAcc);  
  124.             hr = pDisp->Release();  
  125.         }  
  126.         // Get information about the child  
  127.         if(pCAcc) {  
  128.             VariantInit(&varChild);  
  129.             varChild.vt = VT_I4;  
  130.             varChild.lVal = CHILDID_SELF;  
  131.             *paccChild = pCAcc;  
  132.         }else{  
  133.             *paccChild = paccParent;  
  134.         }  
  135.   
  136.         ZeroMemory(szObjName,(MAX_PATH<<1));  
  137.         ZeroMemory(szObjRole,(MAX_PATH<<1));  
  138.         ZeroMemory(szObjClass,(MAX_PATH<<1));  
  139.         GetObjectName(*paccChild,&varChild,szObjName,sizeof(szObjName));  
  140.         GetObjectRole(*paccChild,&varChild,szObjRole,sizeof(szObjRole));  
  141.         GetObjectClass(*paccChild,szObjClass,sizeof(szObjClass));  
  142.   
  143.         LONG px = 0;  
  144.         LONG py = 0;  
  145.         LONG pcx = 0;  
  146.         LONG pcy = 0;  
  147.         (*paccChild)->accLocation(&px,&py,&pcx,&pcy,varChild);  
  148.   
  149.         if(_wcsicmp(L"Button",szObjClass) == 0){  
  150.             if(pcx==dwX) {  
  151.                 if(pcy==dwY) {  
  152.                     //wchar_t ccl[1024] = {0};  
  153.                     //wsprintf(ccl,L"-----------%s %s %s   %d,%d,%d,%d",szObjName,szObjClass,szObjRole,px,py,pcx,pcy);  
  154.                     //OutputDebugStringW(ccl);  
  155.                     (*paccChild)->accDoDefaultAction(varChild); //模拟点击运行按钮  
  156.                     Sleep(1500);//模拟点击,等待按钮响应。  
  157.                 }  
  158.             }  
  159.         }  
  160.   
  161.         if(!found && pCAcc) {  
  162.             // Go deeper  
  163.             found = Find(pCAcc,paccChild);  
  164.             if(*paccChild!=pCAcc){  
  165.                 pCAcc->Release();  
  166.             }  
  167.         }  
  168.     }  
  169.     // Clean up  
  170.     if(pEnum){  
  171.         pEnum->Release();  
  172.     }  
  173.     return found;  
  174. }  
  175.   
  176. BOOL CALLBACK EnumWindowsProc(HWND hwnd,DWORD lParam){  
  177.     wchar_t temp[200];  
  178.     ZeroMemory(temp,400);  
  179.     GetWindowTextW((HWND)hwnd,temp,200);  
  180.     if(_wcsicmp(wsTitle.c_str(),temp) == 0){  
  181.         OutputDebugStringW(temp);  
  182.         if(lParam == SET_BUT){  
  183.             HWND hwndOneClickBar = (HWND)hwnd;  
  184.             IAccessible* accT = NULL;  
  185.             IAccessible* aaaaaaccT = NULL;  
  186.             HRESULT hr = AccessibleObjectFromWindow(hwndOneClickBar,OBJID_WINDOW,IID_IAccessible,(LPVOID*)&accT);  
  187.             if(FAILED(hr)) {  
  188.                 return TRUE;  
  189.             }  
  190.             Find(accT,&aaaaaaccT);  
  191.         }  
  192.     }  
  193.     return TRUE;  
  194. }  
  195.   
  196. void GoClick() {  
  197. //方案1:直接就能找到界面的情况,界面开着呢  
  198.     HWND hw = ::FindWindow(NULL,wsTitle.c_str());  
  199.     if(hw!=NULL) {  
  200.         ::SetWindowPos(hw,0,-100,-100,100,100,SWP_NOZORDER);  
  201.         ::SetWindowLong(hw,GWL_HWNDPARENT,WS_EX_TOOLWINDOW);  
  202.   
  203.         EnumDesktopWindows(0,(WNDENUMPROC)EnumWindowsProc,SET_BUT);  
  204.         CloseHandle(hw);  
  205.         return;  
  206.     }  
  207.   
  208. //方案2:需要自己开启虚拟桌面,然后再启动界面程序,达到隐藏的目的  
  209. #define MAX_B_SIZE 1024  
  210.     wchar_t strS[MAX_B_SIZE] = {0};  
  211.     ZeroMemory(strS,(MAX_B_SIZE<<1));  
  212.     wcscpy_s(strS,MAX_B_SIZE,wsAppPath.c_str());  
  213.     HDESK hDesk = CreateDesktop(L"desktop__vvvv",NULL,NULL,NULL,GENERIC_ALL,NULL);  
  214.     HDESK hDst = GetThreadDesktop(GetCurrentThreadId());  
  215.     SetThreadDesktop(hDesk);  
  216.   
  217.     STARTUPINFO si = {0};  
  218.     si.cb = sizeof(si);  
  219.     si.lpDesktop = L"desktop__vvvv";  
  220.     si.dwFlags = STARTF_USESHOWWINDOW;  
  221.     si.wShowWindow = SW_SHOW;  
  222.     PROCESS_INFORMATION pi = {0};  
  223.     if(CreateProcess(NULL,strS,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) {  
  224.         Sleep(5000);  
  225.         EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowsProc,SET_BUT);  
  226.         Sleep(10000);  
  227.     }  
  228.     CloseDesktop(hDesk);  
  229.     SetThreadDesktop(hDst);  
  230.     return;  
  231. }  
  232.   
  233.   
  234. int _tmain(int argc, _TCHAR* argv[])  
  235. {  
  236.     GoClick();  
  237.     return 0;  
  238. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值