码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-05-26 04:08:01      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   c   code   tar   

原理

        首先枚举到目标按钮所在程序的窗口,然后在该窗口内枚举控件获取控件的句柄,获取到按钮的句柄后可通过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;
}

运行结果截图:
bubuko.com,布布扣
图1 被控端--打字机
bubuko.com,布布扣
图2 模拟控制端
bubuko.com,布布扣
图3 模拟鼠标点击后运行结果

程序链接

模拟鼠标点击按钮的简单示例,布布扣,bubuko.com

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

标签:style   class   blog   c   code   tar   

原文地址:http://blog.csdn.net/arbboter/article/details/26673661

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!