2014-01-08 1 views
4

Я делаю приложение формы Windows C#, которое автоматизирует другое приложение win32 с использованием классов System.Windows.Automation.Как получить доступ к элементам, которые UI Spy не видит для автоматизации приложения win32 с C#

Есть некоторые элементы, которые мне нужно читать или взаимодействовать, но UISpy не находят эти поля, он только нашел родительскую панель контейнера.

Например, этот блок кода ниже должен возвращать множество кнопок ToolStrip, но не работает:

var mainWindow = AutomationElement.RootElement.FindChildByNamePart("Back Office Control"); 
var mainWindowChildren = mainWindow.FindAll(TreeScope.Children, Condition.TrueCondition); 
var toolBarPanel = mainWindowChildren[1]; 
var toolBarItens = toolBarPanel.FindAll(TreeScope.Children, Condition.TrueCondition); 

Существует еще один способ сделать это?

ответ

2

Как вы только что узнали, кнопки ToolStrip не являются на самом деле отдельные элементы управления в окнах обмена сообщениями мира. Это также относится к пунктам меню и некоторым другим элементам управления.

Чтобы вызвать клик, используя сообщение Windows, вам необходимо отправить WM непосредственно на панель инструментов, а не на кнопку, например TB_PRESSBUTTON (http://msdn.microsoft.com/en-us/library/windows/desktop/bb787389(v=vs.85).aspx).

Вы должны использовать функцию WinAPI SendMessage, ориентированную на панель инструментов (вы можете получить hWnd, как обычно), с TB_PRESSBUTTON как тип сообщения, идентификатор команды как wParam и 1 как lParam.

+0

Спасибо за ваш ответ, это было действительно полезно, знаете ли вы, как я могу получить значение из определенной ячейки в управлении сетью данных? – rcarubbi

+0

@rcarubbi Я боюсь, что сетка данных не является стандартным управлением Windows, поэтому вам, вероятно, придется углубиться в фактическое приложение, которое вы пытаетесь контролировать. Это в .NET WinForms, MFC, ...? – Luaan

+0

Я понятия не имею, я думаю, он был построен с Delphi ... это довольно старое приложение. – rcarubbi

0

Для этого вам необходимо использовать вызовы Win32. GetWindow делает это

Помощь Информация - http://msdn.microsoft.com/en-us/library/windows/desktop/ms633515%28v=vs.85%29.aspx

[DllImport("user32.dll")] public static extern int GetWindow(int hwnd,int wCmd); 
+0

Классы из пространства имен System.Windows.Automation делают это за кулисами. Первая строка из блока кода, который я опубликовал, выполняет точно такую ​​же работу. var mainWindow = AutomationElement.RootElement.FindChildByNamePart («Управление бэк-офисом»); К сожалению, проблема, с которой я сталкиваюсь, глубже, чем просто получить окно. – rcarubbi

Смежные вопросы