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