在循环中按下另一个应用程序中的按钮

本文关键字:应用程序 另一个 按钮 循环 | 更新日期: 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);