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

//#include "stdafx.h"
#include <string>
#include <Oleacc.h>
using namespace std;#define SET_LIST 1
#define SET_BUT 2#pragma comment(lib,"Oleacc.lib")wstring wsTitle = L"title";
wstring wsAppPath = L"adasd\asdasd\asdasd\asd.exe";
DWORD dwX = 60;
DWORD dwY = 20;/*
目的:模拟点击自绘控件,同时不干扰电脑正常工作,也可以理解成不让使用者察觉到。测试功能:找到title是wsTitle的窗体,将位置移动到用户看不到的区域,然后以这个窗体为树根,遍历窗体上的所有其他小窗体,目标是找到一个自绘的
byutton,尺寸是dwX,dwY。的自绘控件,然后模拟一次点击。如果界面程序不存在的话就开启一个虚拟桌面,然后在虚拟桌面上去启动这个界面程序,然后模拟。假设界面程序的路径是wsAppPath。
*/void GetObjectName(IAccessible* child,VARIANT* varChild,wchar_t* objName,int len) {BSTR strTmp;HRESULT hr = child->get_accName(*varChild,&strTmp);if(S_OK!=hr) {return;}//_bstr_t str = strTmp;//wchar_t* tmp = str;wchar_t* tmp = strTmp;wcscpy_s(objName,MAX_PATH,tmp);
}
void GetObjectRole(IAccessible* child,VARIANT* varChild,wchar_t* objRole,int len) {VARIANT pvarRole;DWORD roleId;child->get_accRole(*varChild,&pvarRole);if(varChild->vt!=VT_I4) {pvarRole.vt = VT_EMPTY;return /*E_INVALIDARG*/;}roleId = pvarRole.lVal;UINT   roleLength;LPTSTR lpszRoleString;// Get the length of the string.roleLength = GetRoleText(roleId,NULL,0);// Allocate memory for the string. Add one character to// the length you got in the previous call to make room// for the null character.lpszRoleString = (LPTSTR)malloc((roleLength+1) * sizeof(TCHAR));if(lpszRoleString!=NULL) {// Get the string.GetRoleText(roleId,lpszRoleString,roleLength+1);}wchar_t* tmp = lpszRoleString;wcscpy_s(objRole,MAX_PATH,tmp);free(lpszRoleString);return /*S_OK*/;}void GetObjectClass(IAccessible* child,wchar_t* objClass,int len) {HWND htmp;LPTSTR strClass;strClass = (LPTSTR)malloc(MAX_PATH);::WindowFromAccessibleObject(child,&htmp);if(0==::GetClassName(htmp,strClass,MAX_PATH)) {free(strClass);return;}wchar_t* tmp = strClass;wcscpy_s(objClass,MAX_PATH,tmp);free(strClass);
}BOOL Find(IAccessible* paccParent,IAccessible** paccChild) {HRESULT hr;long numChildren;unsigned long numFetched;VARIANT varChild;int indexCount;IAccessible* pCAcc = NULL;IEnumVARIANT* pEnum = NULL;IDispatch* pDisp = NULL;BOOL found = false;wchar_t szObjName[MAX_PATH],szObjRole[MAX_PATH],szObjClass[MAX_PATH],szObjState[MAX_PATH];//Get the IEnumVARIANT interfacehr = paccParent->QueryInterface(IID_IEnumVARIANT,(PVOID*)&pEnum);if(pEnum){pEnum->Reset();}// Get child countpaccParent->get_accChildCount(&numChildren);for(indexCount = 1; indexCount<=numChildren && !found; indexCount++) {pCAcc = NULL;// Get next childif(pEnum)hr = pEnum->Next(1,&varChild,&numFetched);else {varChild.vt = VT_I4;varChild.lVal = indexCount;}// Get IDispatch interface for the childif(varChild.vt==VT_I4) {pDisp = NULL;hr = paccParent->get_accChild(varChild,&pDisp);}elsepDisp = varChild.pdispVal;// Get IAccessible interface for the childif(pDisp) {hr = pDisp->QueryInterface(IID_IAccessible,(void**)&pCAcc);hr = pDisp->Release();}// Get information about the childif(pCAcc) {VariantInit(&varChild);varChild.vt = VT_I4;varChild.lVal = CHILDID_SELF;*paccChild = pCAcc;}else{*paccChild = paccParent;}ZeroMemory(szObjName,(MAX_PATH<<1));ZeroMemory(szObjRole,(MAX_PATH<<1));ZeroMemory(szObjClass,(MAX_PATH<<1));GetObjectName(*paccChild,&varChild,szObjName,sizeof(szObjName));GetObjectRole(*paccChild,&varChild,szObjRole,sizeof(szObjRole));GetObjectClass(*paccChild,szObjClass,sizeof(szObjClass));LONG px = 0;LONG py = 0;LONG pcx = 0;LONG pcy = 0;(*paccChild)->accLocation(&px,&py,&pcx,&pcy,varChild);if(_wcsicmp(L"Button",szObjClass) == 0){if(pcx==dwX) {if(pcy==dwY) {//wchar_t ccl[1024] = {0};//wsprintf(ccl,L"-----------%s %s %s   %d,%d,%d,%d",szObjName,szObjClass,szObjRole,px,py,pcx,pcy);//OutputDebugStringW(ccl);(*paccChild)->accDoDefaultAction(varChild); //模拟点击运行按钮Sleep(1500);//模拟点击,等待按钮响应。}}}if(!found && pCAcc) {// Go deeperfound = Find(pCAcc,paccChild);if(*paccChild!=pCAcc){pCAcc->Release();}}}// Clean upif(pEnum){pEnum->Release();}return found;
}BOOL CALLBACK EnumWindowsProc(HWND hwnd,DWORD lParam){wchar_t temp[200];ZeroMemory(temp,400);GetWindowTextW((HWND)hwnd,temp,200);if(_wcsicmp(wsTitle.c_str(),temp) == 0){OutputDebugStringW(temp);if(lParam == SET_BUT){HWND hwndOneClickBar = (HWND)hwnd;IAccessible* accT = NULL;IAccessible* aaaaaaccT = NULL;HRESULT hr = AccessibleObjectFromWindow(hwndOneClickBar,OBJID_WINDOW,IID_IAccessible,(LPVOID*)&accT);if(FAILED(hr)) {return TRUE;}Find(accT,&aaaaaaccT);}}return TRUE;
}void GoClick() {
//方案1:直接就能找到界面的情况,界面开着呢HWND hw = ::FindWindow(NULL,wsTitle.c_str());if(hw!=NULL) {::SetWindowPos(hw,0,-100,-100,100,100,SWP_NOZORDER);::SetWindowLong(hw,GWL_HWNDPARENT,WS_EX_TOOLWINDOW);EnumDesktopWindows(0,(WNDENUMPROC)EnumWindowsProc,SET_BUT);CloseHandle(hw);return;}//方案2:需要自己开启虚拟桌面,然后再启动界面程序,达到隐藏的目的
#define MAX_B_SIZE 1024wchar_t strS[MAX_B_SIZE] = {0};ZeroMemory(strS,(MAX_B_SIZE<<1));wcscpy_s(strS,MAX_B_SIZE,wsAppPath.c_str());HDESK hDesk = CreateDesktop(L"desktop__vvvv",NULL,NULL,NULL,GENERIC_ALL,NULL);HDESK hDst = GetThreadDesktop(GetCurrentThreadId());SetThreadDesktop(hDesk);STARTUPINFO si = {0};si.cb = sizeof(si);si.lpDesktop = L"desktop__vvvv";si.dwFlags = STARTF_USESHOWWINDOW;si.wShowWindow = SW_SHOW;PROCESS_INFORMATION pi = {0};if(CreateProcess(NULL,strS,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) {Sleep(5000);EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowsProc,SET_BUT);Sleep(10000);}CloseDesktop(hDesk);SetThreadDesktop(hDst);return;
}int _tmain(int argc, _TCHAR* argv[])
{GoClick();return 0;
}

虚拟桌面模拟查找点击自绘控件相关推荐

  1. android模拟鼠标点击事件给控件,Android使用模拟鼠标拖动操作

    将远程控制支持添加到android2.2版本. 此处的看起来与电视所使用的相似,不同之处在于它具有比电视更多的自定义功能按钮. 单击上的切换按钮,当切换到鼠标模式时,在android视图上绘制类似鼠标 ...

  2. MFC自绘控件学习总结

    前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...

  3. 点击MSFlexGrid数据控件的标题进行数据排序

    在进行数据库编程的时候,经常会用到MSFlexGrid控件进行数据显示.并且对数据进行排序是必不可少的一个环节.使用WINDOWS系统的用户,会习惯于点击标题进行数据排序.而MSFlexGrid控件本 ...

  4. php搜索选择列表控件,jQuery_JQuery里面的几种选择器 查找满足条件的元素$(#控件ID),样式:$(function (){ $(要选择的 - phpStudy...

    JQuery里面的几种选择器 查找满足条件的元素$("#控件ID") 样式:$(function (){ $("要选择的标签").click(function ...

  5. MFC自绘控件学习总结(1)

    前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...

  6. MFC基础,MFC自绘控件学习总结.---转

    前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...

  7. MFC自绘控件学习总结.-- 转

    前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...

  8. MFC基础,MFC自绘控件学习总结.-- 转

    前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...

  9. js模拟表单html形式,JS模拟并美化的表单控件完整实例

    本文实例讲述了JS模拟并美化的表单控件效果实例.分享给大家供大家参考.具体如下: 这里演示使用JS美化并模拟网页表单控件,十分漂亮的表单效果,使用时可以将代码内的JS保存为文件, 方便调用,使用方法: ...

最新文章

  1. iOS 线程之GCD的高级使用方法
  2. c 路径 空格 参数_好听的炫舞名字空格最新_好听的炫舞名字空格2020
  3. php数组array_push()和array_pop()以及array_shift()函数
  4. pyqt5 最小化 系统托盘_Qt中如何使窗口隐藏/最小化到托盘
  5. jdk8 接口新特性
  6. nlp基础—10.结巴分词的应用及底层原理剖析
  7. ArcGIS 字段计算器取前几位和替换操作
  8. 百度网盘破解版Pandownload开发者被抓
  9. pyenv管理虚拟环境
  10. Iterator 怎么使用?有什么特点?
  11. 使用POI创建Excel无法打开
  12. 头歌-信息安全技术-【实训10】HTML信息隐藏、动态分析技术
  13. 快速排序的枢轴(pivot)和边界
  14. 相关算法---字符串
  15. 基于HTML电商项目的设计与实现——html静态网站基于数码类电商购物网站网页设计与实现共计30个页面...
  16. OSChina 周五乱弹 —— 破手机比 2080ti 核动力煤气灶还贵
  17. “人到中年”成网红,旺旺能否借此重返“旺季”?
  18. RTX 实时系统 IntervalZero 官方文档
  19. 浅谈STM32 USART串口中断配置函数USART_ITConfig()的编程思路
  20. 湖北武汉资料员培训资料员在建筑工程中的作用建筑七大员培训

热门文章

  1. [C++基础]018_常量指针和指向常量的指针
  2. cocos2d-x温故(三)!
  3. 石川es6课程---4、箭头函数
  4. Python中的高级变量类型
  5. Django REST framework快速入门
  6. loadrunner 更新中......
  7. 重拾简单的linux指令之info 【转】
  8. 转gsoap使用总结
  9. JNI学习开始篇 基础知识 数据映射及学习资料收集
  10. 使用钩子函数[3] - 建立一个全局的鼠标钩子