模拟鼠标点击按钮的简单示例

原理

首先枚举到目标按钮所在程序的窗口,然后在该窗口内枚举控件获取控件的句柄,获取到按钮的句柄后可通过SendMessage或者PostMessage来发送消息模拟鼠标点击按钮等交互方式。但是因为枚举窗口和句柄都是使用WIN32 API,所以只能枚举到WIN32的控件,对于那些不是微软提供的控件则表示无能为力了。本示例简单地模拟一个往打字机里面写入数据,点击确认的方法。

主要代码

HWND hBtnAdd = NULL;
HWND hEditAdd = NULL;
HWND hEditMain = NULL;

BOOL CALLBACK   EnumChildWindows(HWND   hwnd,   LPARAM   lParam)
{
	TCHAR str[1000];
	CString temp(str);
	RECT	rtEdit;

	GetWindowText(hwnd, str, sizeof(str));//获取窗口标题

	//temp = str;
	//temp += _T(" : ");
	//GetClassName(hwnd,str,sizeof(str));//获取类名
	//temp += str;
	//AfxMessageBox(temp);
	if(_tcscmp(str, _T("Add")) == 0)
	{
		hBtnAdd = hwnd;
		return TRUE;
	}
	GetClassName(hwnd,str,sizeof(str));//获取类名
	if(_tcscmp(str, _T("Edit")) == 0)
	{
		::GetWindowRect(hwnd, &rtEdit);
		// 这里根据EDIT控件大小判断是哪个控件
		if(rtEdit.bottom-rtEdit.top > 100)
		{
			hEditMain = hwnd;
		}
		else
		{
			hEditAdd = hwnd;
		}
	}
	return TRUE;
}
BOOL CALLBACK lpEnumWindows(HWND hwnd, LPARAM lParam)
{

	TCHAR str[1000];
	GetWindowText(hwnd,str,sizeof(str));//获取窗口标题
	CString temp(str);
	//AfxMessageBox(temp);
	//GetClassName(hwnd,str,sizeof(str));//获取类名
	//temp=CString(str);
	//AfxMessageBox(temp);
	if(_tcscmp(str, _T("打字机机")) == 0)
	{
		AfxMessageBox(_T("找到!"));
		EnumChildWindows(hwnd,EnumChildWindows,NULL);  //获取子窗口 (包括控件)
	}

	return TRUE;
}
void Ctest3Dlg::OnBnClickedButton1()
{
	EnumWindows(lpEnumWindows, NULL);

	TCHAR szText[256] = {0};
	//if (hEditAdd)
	//{
	//	::SendMessage(hEditAdd, WM_GETTEXT , sizeof(szText), (LPARAM)szText);
	//	//AfxMessageBox(szText);
	//}
	//if (hBtnAdd)
	//{
	//	::SendMessage(hBtnAdd, WM_GETTEXT , sizeof(szText), (LPARAM)szText);
	//	//::GetWindowText(hBtnAdd, szText, sizeof(szText));
	//	//AfxMessageBox(szText);
	//}
	//if (hEditMain)
	//{
	//	::SendMessage(hEditMain, WM_GETTEXT , sizeof(szText), (LPARAM)szText);
	//	//::GetWindowText(hEditMain, szText, sizeof(szText));
	//	//AfxMessageBox(szText);
	//}

	int n = 10;
	if(hEditMain && hBtnAdd && hEditAdd)
	{
		// 获取Button的ID
		DWORD nId = ::GetDlgCtrlID(hBtnAdd);
		// 发送BN_CLICKED通知,通过WM_COMMAND消息
		while(1)
		{
			wsprintf(szText, _T("%d"), ++n);
			::SendMessage(hEditAdd, WM_SETTEXT , sizeof(szText), (LPARAM)szText);
			::PostMessage(::GetParent(hBtnAdd), WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hBtnAdd);
			Sleep(1000);
		}
	}
	return;
}

运行结果截图:

图1 被控端--打字机

图2 模拟控制端

图3 模拟鼠标点击后运行结果

程序链接

点死我

模拟鼠标点击按钮的简单示例

时间: 2024-10-13 15:55:55

模拟鼠标点击按钮的简单示例的相关文章

WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)

好久没有写文章,发一篇顶顶博客访问量.别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么..流量该多少就多少吧... 回到主题,在webbrowser中点击某链接网上几乎都是用document对象模拟点击,这个方法基本能应对一般的情况,但是例如广告联盟的点击XXX就有检测机制(不多解释,你们懂的).所以完全模拟鼠标的点击事件就比较完美.于是我用了最常见的SendMessage. 接下来就要解决一个问题,webbrowser的句柄问题.从控件本身得到的句柄不是真正的浏览

使用powershell/vbs自动化模拟鼠标点击操作

今天想做windows上的自动化,所以才有了模拟鼠标点击的需求,先考虑用powershell实现: 首先先安装一个名为“WASP”免费可用的Powershell扩展程序,下载地址:http://wasp.codeplex.com/ 下载解压之后放到C:\Windows\System32\WindowsPowerShell\v1.0\Modules\下,如图: 之后,在开始->运行处输入powershell,以管理员方式运行, 执行Import-Module WASP,则引入了扩展程序, 假如有个

jQuery模拟鼠标点击事件失效的问题

最近使用jQuery操作浏览器获取数据,需要对分页的信息进行处理,发现直接使用$('div#pager a.next').click();的这种写法无法触发点击事件. 使用trigger('click')的写法也是无济于事. 在网上一顿扒拉后,发现使用$('div#pager a.next')[0].click();就OK了. $('div#pager a.next')[0]这种写法其实就相当于把jQuery对象转换为Dom对象了. 模拟点击不生效的原因 如果使用jQuery的写法:$('a#t

求助:程序如何模拟鼠标点击一个TreeView节点?

void CreateTreeViewControl(HWND hMainWnd) { g_hTreeView = CreateWindow(WC_TREEVIEW, _T("Tree View"), WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT, 5, 5, 320, 480, hMainWnd, NULL, hInst, NULL); TVINSERTSTRUCT tvInsertStruct

CSS3和SVG炫酷鼠标点击按钮效果

这是一组效果非常炫酷的HTML5 SVG和CSS3鼠标点击按钮特效.这组鼠标点击按钮特效共有22种效果,大多数是在伪元素上使用CSS3 animations来制作动画效果.非常适合于移动手机APP上的按钮触摸特效. 在线演示:http://www.htmleaf.com/Demo/201502121370.html 下载地址:http://www.htmleaf.com/html5/SVG/201502121369.html

模拟鼠标点击键盘按下

#include <Windows.h> #include <stdlib.h> //打开程序或网页 void open(char *str) { ShellExecuteA(0, "open", str, 0, 0, 1); } //关闭程序 void close() { system("http://taskkill /f /im liebao.exe"); } //模拟键盘按下实现输入 void search() { keybd_eve

QT中模拟鼠标点击事件

传入座标,模拟鼠标点击QWebView中网页上的某一点 qDebug()<<"mouse clicked"; QPoint pos(403,34); QMouseEvent event0(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(view->page(), &event0); QMouseEven

利用python模拟鼠标点击自动完成工作,提升你的工作效率!

没有什么能比学以致用让学习变得更有动力的了. 不知道大家在工作中有没有一些工作需要重复的点击鼠标,因为会影响到财务统计报表的关系,我们每个月底月初都要修改ERP中的单据日期,单据多的时候光修改就能让你点鼠标点到手麻.(这里要吐槽一下浪沙软件,别的单据都可以批量修改日期,就是这个移仓单不行,你们研发怎么就这么懒?剩下这么点工作就不完成他?)之前同事有跟我提到过键盘精灵,因为当时负责别的工作,一直没有去了解.现在公司人员减少了,这工作又回到我身上了,刚好之前我在学习连连看的时候,知道Python 也

Python模拟鼠标点击——如何正确的肝阴阳师

本来嘛,说好了要写Selenium自动化搜电影的笔记的,然后正好今天上课无聊玩阴阳师开了个SSR,发现还有600体!准备怒刷之,但是又肝不动了.打算尝试用Python写个脚本来代替我自动点击(PC端,安卓模拟器) 大家放心我没写出来 写好在测试的时候,发现一到安卓模拟器就丢失焦点(也可能是点不了),对win32编程完全不熟悉,研究了2,3个小时没解决.又跟一个网易游戏的聚聚聊了会,他用C++写的用得和我一样的方法完成了..... (如果有必要我明天换C++写一下...)但是测试了其他游戏,如腾讯