我有一个从命令行应用程序启动的 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);
}