У меня есть приложение WPF, которое запускается из приложения командной строки.
Я пытаюсь выполнить простую автоматизацию (получить / установить текст, нажать некоторые кнопки и т. Д.). Я не могу найти ни одно из дочерних окон в WPF.
У меня есть рабочие модели с WPF и UIA Framework, WinForms и WinAPI, но не получается заставить WinAPI и WPF работать хорошо.
Я использовал UISpy, WinSpy ++, Winspector, приложение UIA Verify для проверки элементов управления и т. Д., Но, похоже, они не содержат ту же информацию для WPF, что и WinForms.
Например, в приложении WinForms я вижу текстовое поле с ClassName «WindowsForms10.EDIT.app.0.33c0d9d», когда я смотрю через шпионские инструменты. Только приложение UIA Automation Verify подтверждает, что элемент существует, и выдает сообщение «TextBox».
Итак, мой вопрос: как найти правильное имя класса для передачи или есть более простой путь для поиска дочерних элементов?
// 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);
}