Вызов элемента подменю с помощью UIAutomationClient не может найти элементы подменюC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Вызов элемента подменю с помощью UIAutomationClient не может найти элементы подменю

Сообщение Anonymous »

Я видел, как этот вопрос задавался и отвечал на него с использованием разных платформ, но не с использованием C#, Interop.UIAutomationClient и .NET 8.0. Ответ всегда один и тот же: обязательно разверните пункт меню, прежде чем находить пункты подменю. Я делаю это, поскольку этот код перемещается из приложения .NET Windows с помощью AutomationElement в консольное приложение, где мои параметры, похоже, используют COM-объект для автоматизации. Для выполнения этой работы я написал пару классов.
Классы-оболочки элементов автоматизации окон, которые поддерживают некоторые шаблоны элементов.

Код: Выделить всё

    public class WindowElement
{
private IUIAutomationElement? element;

public WindowElement(IUIAutomationElement element)
{
this.element = element;
}

public WindowElement()
{
}

public bool IsValid()
{
return element != null;
}

public IUIAutomationElement GetElement()
{
return element;
}

public bool Expand()
{
if (element != null)
{
IUIAutomationExpandCollapsePattern pattern = element.GetCurrentPattern(WindowAutomation.UIA_ExpandCollapsePatternId);
pattern.Expand();
return pattern.CurrentExpandCollapseState == ExpandCollapseState.ExpandCollapseState_Expanded;
}
return false;
}

public bool Invoke()
{
if (element != null)
{
IUIAutomationInvokePattern pattern = element.GetCurrentPattern(WindowAutomation.UIA_InvokePatternId);
pattern.Invoke();
return true;
}
return false;
}

public bool Select()
{
if (element != null)
{
IUIAutomationSelectionItemPattern pattern = element.GetCurrentPattern(WindowAutomation.UIA_SelectionItemPatternId);
pattern.Select();
return true;
}
return false;
}
}
Класс, предназначенный для поиска элементов путем поиска известного приложения по идентификатору процесса (для запуска подпроцесса) или по известному имени программы.

Код: Выделить всё

public class WindowAutomation
{
private CUIAutomation8 uia = new CUIAutomation8();

public WindowElement FindProcessNameElement(string processName)
{
IUIAutomationElement root = uia.GetRootElement();
IUIAutomationElementArray children = root.FindAll(TreeScope.TreeScope_Children, uia.CreateTrueCondition());
for (int i = 0; i < children.Length; i++)
{
IUIAutomationElement child = children.GetElement(i);
string childName = child.CurrentName;
if (childName.StartsWith(processName))
{
return new WindowElement(child);
}
}
return new WindowElement();
}

public WindowElement FindMenuBarItem(WindowElement appElement, string itemName)
{
if (appElement.IsValid())
{
IUIAutomationElementArray items = appElement.GetElement().FindAll(TreeScope.TreeScope_Children, uia.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_MenuBarControlTypeId));
if (items.Length > 0)
{
items = items.GetElement(0).FindAll(TreeScope.TreeScope_Children, uia.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_MenuItemControlTypeId));
for (int i = 0; i < items.Length; i++)
{
IUIAutomationElement item = items.GetElement(i);
if (item.CurrentName == itemName)
{
return new WindowElement(item);
}
}
}
}
return new WindowElement();
}

public WindowElement FindSubmenuItem(WindowElement menuItem, string subitemName)
{
if (menuItem.IsValid())
{
menuItem.Expand();
IUIAutomationElementArray items = menuItem.GetElement().FindAll(TreeScope.TreeScope_Descendants, uia.CreatePropertyCondition(UIA_ControlTypePropertyId, UIA_MenuItemControlTypeId));
if (items.Length > 0)
{
for (int i = 0; i < items.Length;  i++)
{
IUIAutomationElement item = items.GetElement(i);
string name = item.CurrentName;
if (item.CurrentName == subitemName)
{
return new WindowElement(item);
}
}
}
}
return new WindowElement();
}`
При поиске элементов подменю я никогда не получаю никаких результатов. Я читал другие ответы, в которых говорится, что обязательно используйте TreeScope_Descendants, что я и сделал. И затем, конечно же, ответы, в которых говорится, что вы должны развернуть меню, что я сделал и вижу, что оно работает.

Код: Выделить всё

WindowElement app = ui.FindProcessNameElement("gMotor2 MAS");
WindowElement fileMenu = ui.FindMenuBarItem(app, "File");
if (fileMenu.Expand())
{
Console.WriteLine("Expanded file menu");
}
WindowElement exitItem = ui.FindSubmenuItem(fileMenu, "Exit");
exitItem.Invoke();
Я ожидал, что Invoke() выйдет из приложения. Я вижу, как меню расширяется, но, поскольку элементы подменю никогда не возвращаются, вызов exitItem ничего не дает.

Подробнее здесь: https://stackoverflow.com/questions/793 ... menu-items
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Вызов элемента подменю с помощью UIAutomationClient не может найти элементы подменю
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Как использовать FindAll() с пакетом nuget Interop.UIAutomationClient
    Anonymous » » в форуме C#
    0 Ответы
    169 Просмотры
    Последнее сообщение Anonymous
  • Как исправить положение подменю, чтобы край подменю совпадал с краем главного меню?
    Гость » » в форуме CSS
    0 Ответы
    129 Просмотры
    Последнее сообщение Гость
  • Ulkit - добавление верхнего подменю навигации и подменю вне холста типа аккордеона
    Anonymous » » в форуме CSS
    0 Ответы
    46 Просмотры
    Последнее сообщение Anonymous
  • Javascript, который переключает подменю, а также отключает ссылки на подменю
    Anonymous » » в форуме Jquery
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»