您的位置:首页 > 其它

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

2014-05-23 10:08 489 查看

原理

        首先枚举到目标按钮所在程序的窗口,然后在该窗口内枚举控件获取控件的句柄,获取到按钮的句柄后可通过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 模拟鼠标点击后运行结果

程序链接

点死我
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: