0

我有一个从命令行应用程序启动的 WPF 应用程序。

我正在尝试做一些简单的自动化(获取/设置文本,单击一些按钮等)。我似乎在 WPF 中找不到任何子窗口。

我有 WPF 和 UIA 框架、WinForms 和 WinAPI 的工作模型,但似乎无法让 WinAPI 和 WPF 很好地发挥作用。

我使用过 UISpy、WinSpy++、Winspector、UIA 验证应用程序来查看控件等,但它们似乎没有为 WPF 提供与 WinForms 相同的信息。

例如,在 WinForms 应用程序中,当我通过间谍工具查看时,我看到了一个 ClassName 为“WindowsForms10.EDIT.app.0.33c0d9d”的文本框。UIA 自动化验证应用程序是唯一确认元素存在并报告“文本框”的应用程序。

所以,我的问题是如何找到要传递的正确类名,或者是否有更简单的方法来查找子元素?

// does not work in wpf
IntPtr child = NativeMethods.FindWindowEx(parent, prevElement, "TextBox", null);

// works in winforms
IntPtr child = NativeMethods.FindWindowEx(parent, prevElement, "WindowsForms10.EDIT.app.0.33c0d9d", null);

这是我正在使用的 user32.dll 导入:

public class NativeMethods
{
    public const int WM_SETTEXT = 0x000C;
    public const int WM_GETTEXT = 0x000D; 
    public const uint CB_SHOWDROPDOWN = 0x014F;
    public const uint CB_SETCURSEL = 0x014E;
    public const int BN_CLICKED = 245;
    public const uint WM_SYSCOMMAND = 0x0112;
    public const int SC_CLOSE = 0xF060;

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);

    [DllImport("user32.dll", SetLastError = false)]
    public static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    public static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, string lParam);

    [DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    public static extern int SendMessage(int hWnd, int Msg, int wParam, StringBuilder lParam); 


}
4

1 回答 1

3

如果要自动化 WPF,则必须使用 UI 自动化,而不是“过去的旧事物”Windows API :-)。

这里有一个关于 UI 自动化的很好的介绍:Bugslayer: GUI Control to Major Tom

还有一个有趣的开源项目名为“White”,它利用了 UI 自动化:Codeplex 上的 White。如果您想深入研究,那里有一些样本。

于 2010-12-15T18:54:29.273 回答