在循环中按下另一个应用程序中的按钮
本文关键字:应用程序 另一个 按钮 循环 | 更新日期: 2023-09-27 18:32:00
我已经成功地编写了一个应用程序来按下另一个应用程序中的按钮。现在我正在尝试循环重复按钮按下,我的应用程序挂起,但我不明白为什么。
上下文
我有一个对我非常有帮助的应用程序,但是开发它的人并没有想到一切。在应用程序中的某个时刻,将打开一个对话框,要求确认是否将现有数据替换为上传的数据。我需要单击"确定"才能同意,但问题是我向此应用程序上传了大量数据,并且它没有"适用于所有"复选框。所以我必须反复单击"确定"。因此,我正在开发一个应用程序,该应用程序将为我按"确定"按钮,直到对话框停止出现。
法典
单击按钮一次的代码(这有效)...
private void btnOKloop_Click(object sender, System.EventArgs e)
{
int hwnd=0;
IntPtr hwndChild = IntPtr.Zero;
//Get a handle for the Application main window
hwnd = FindWindow(null, "Desired MessageBox");
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK");
//send system message
if (hwnd != 0)
{
SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero);
}
else
{
MessageBox.Show("Button Could Not Be Found!", "Warning", MessageBoxButtons.OK);
}
}
在循环中单击按钮的代码(此挂起)...
private void btnOKloop_Click(object sender, System.EventArgs e)
{
int hwnd=0;
IntPtr hwndChild = IntPtr.Zero;
hwnd = FindWindow(null, "Desired MessageBox");
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK");
do
{
SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero);
} while (hwnd != 0);
你的循环永远不会退出:
hwnd = FindWindow(null, "Desired MessageBox");
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK");
do
{
SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero);
} while (hwnd != 0);
您已在循环外部设置了hwnd
变量,然后循环直到值更改为 0。但是,由于您没有在循环中设置值,因此它永远不会更改。您可以通过简单地在循环中移动变量赋值语句来解决此问题:
do
{
hwnd = FindWindow(null, "Desired MessageBox");
if (hwnd != 0) {
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK");
SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero);
}
} while (hwnd != 0);
不过,您可能会遇到一些麻烦。它可能移动得太快,试图在对话框有机会打开之前找到下一个对话框。我建议您添加一个小延迟并将其调整到适当的时间段,以允许下一个窗口打开:
do
{
hwnd = FindWindow(null, "Desired MessageBox");
if (hwnd != 0) {
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "OK");
SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero);
}
System.Threading.Thread.Sleep(250); // 250 milliseconds: 0.25 seconds between clicks.
} while (hwnd != 0);