0

我正在用 C# 为应用程序构建一个小型 GUI 测试自动化工具。测试工具中的功能之一是关闭从测试应用程序弹出的对话框。

我遇到的麻烦是找到要单击的按钮而不给出完整的类名。我使用 FindWindowEx 方法来获取对话框和我想要单击的按钮。我知道按钮的标题,但麻烦的是我还需要为按钮指定类名。类名并不总是相同,但看起来像这样:“WindowsForms10.BUTTON.app.0.3ce0bb8”。例如,如果您在本地或通过单击一次启动应用程序,最后“3ce0bb8”的部分会有所不同。

所以,我的问题是:我怎样才能找到按钮,只需指定类的第一部分(始终相同),如“”WindowsForms10.BUTTON.app。”或者我可以用其他方式解决这个问题吗?

dll 导入如下所示:

[DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string pszWindow);

尝试单击按钮时,我的代码如下所示:

private void SendDialogButtonClick(IntPtr windowHandle, ApplicationStartType applicationStartType)
    {
        if (applicationStartType == ApplicationStartType.Localy)
            buttonClassName = "WindowsForms10.BUTTON.app.0.3ce0bb8";
        else if (applicationStartType == ApplicationStartType.ClickOnce)
            buttonClassName = "WindowsForms10.BUTTON.app.0.3d893c";

        // Find the "&No"-button
        IntPtr buttonAndNoHandle = FindWindowEx(windowHandle, IntPtr.Zero, buttonClassName, "&No");

        // Send the button click event to the appropriate button found on the dialog
        if (buttonAndNoHandle.ToInt64() != 0)
        {
            SendMessage(new HandleRef(null, buttonAndNoHandle), WM_CLICK, IntPtr.Zero, IntPtr.Zero);
        }
    }
4

1 回答 1

2

是的,这很困难,类名是自动生成的。您不能使用 FindWindowEx(),您必须使用 EnumChildWindows() 和 GetClassName() 来迭代控件。

您可以调整Managed Spy 工具的源代码,以使这一切变得更加轻松和清晰。

于 2010-08-06T13:36:24.110 回答