user32.dll FindWindowEx, поиск элементов по имени класса в удаленном окне WPF

У меня есть приложение WPF, которое запускается из приложения командной строки.

Я пытаюсь сделать простую автоматизацию (получить/установить текст, нажать несколько кнопок и т. д.). Кажется, я не могу найти ни одно из дочерних окон в WPF.

У меня есть рабочие модели с WPF и UIA Framework, WinForms и WinAPI, но я не могу заставить WinAPI и WPF работать хорошо.

Я использовал UISpy, WinSpy++, Wspawn, приложение 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); 


}

person ajberry    schedule 15.12.2010    source источник


Ответы (1)


Если вы хотите автоматизировать WPF, вы должны использовать автоматизацию пользовательского интерфейса, а не "устаревшее" API Windows :-).

Здесь есть хорошее введение в автоматизацию пользовательского интерфейса: Bugslayer: GUI Control to Major Tom

Существует также интересный проект с открытым исходным кодом под названием «White», в котором используется автоматизация пользовательского интерфейса: White on codeplex. Там есть несколько образцов, если вы хотите покопаться.

person Simon Mourier    schedule 15.12.2010
comment
Я предпочитаю путь автоматизации пользовательского интерфейса. У меня это работает в WPF и автоматизации пользовательского интерфейса, а также в WinForms и WinAPI. Частью этого упражнения было определение того, можно ли это (WPF с WinAPI) сделать. Из комментариев ниже видно, что для WinForms и предыдущих приложений WinAPI является опцией, а WPF и не только используют автоматизацию пользовательского интерфейса. Спасибо! - person ajberry; 15.12.2010
comment
Ну, автоматизация пользовательского интерфейса также работает для обычных Windows и Winforms, потому что она может полагаться на устаревший SDK MSAA (Accessibility), однако мой опыт показывает, что поддержка не полностью согласована на всех платформах. Но да, автоматизация пользовательского интерфейса — это действительно то, что нужно для WPF, плюс, если вы владеете кодом на стороне сервера, вы можете оснастить свои собственные элементы управления и UIElement аналогами автоматизации, которые упрощают обработку внешних клиентов. - person Simon Mourier; 15.12.2010