4

我已经成功编写了一个应用程序来按下另一个应用程序中的按钮。现在我试图循环重复按下按钮,我的应用程序挂起,但我不明白为什么。

语境

我有一个对我很有帮助的应用程序,但开发它的人并没有考虑到所有问题。在应用程序中的某个位置,会打开一个对话框,要求确认是否用上传的数据替换现有数据。我需要点击OK同意,但问题是我将大量数据上传到此应用程序并且它没有“适用于所有”复选框。所以我必须OK反复点击。因此,我正在开发一个应用程序,它将OK为我按下按钮,直到对话框停止出现。

代码

单击按钮一次的代码(这有效)...

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);
4

1 回答 1

1

你的循环永远不会退出:

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);
于 2013-09-24T13:09:54.170 回答