Идентификатор элемента графического интерфейса Windows (AutomationElement HashCode и RuntimeID) - PullRequest
1 голос
/ 24 февраля 2011

Я ищу способ идентифицировать экземпляры определенного элемента графического интерфейса (например, запись «копировать» в контекстном меню проводника Windows).

Я попробовал оба метода .GetHashCode и .GetRuntimeId на AutomationElement , но они оба меняются каждый раз, когда я открываю контекстное меню.

В чем разница /В любом случае, цель между RuntimeId и HashCode?

Есть идеи, как определить элемент GUI, не сравнивая строку метки / имени?

Ответы [ 2 ]

0 голосов
/ 28 июня 2012

Как правило, вам придется перемещаться по иерархии GUI.Начиная с элемента AutomationElement, представляющего программу (главное окно), вы должны перейти вниз к панели меню (циклически по всем дочерним элементам), а затем к желаемому элементу MenuItem (циклически снова).Каждый раз, когда вам нужно проверить, например, свойство current.Name.Затем вы можете прочитать его, вызвать его, использовать ClickablePoint, чтобы найти, где его щелкнуть. Также обратите внимание, что для того, чтобы получить его, вам также нужно открыть меню, поэтому вам нужно будет щелкнуть там (или использовать какой-то шаблон)ну, во-первых.Использование SendKeys.Send, если есть несколько простых сочетаний клавиш, может быть проще.Пока этого достаточно (может быть alt + несколько клавиш курсора + также ввод).

0 голосов
/ 01 марта 2011

Существуют различные способы, однако в классе AutomationElement вы можете проверить элемент «Текущий» и использовать комбинацию способов для определения элемента.Следующий пример был взят из другого решения См. Здесь

using System.Window.Automation;        
private AutomationElement element;
System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position;
this.element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));

Отсюда вы можете получить доступ к элементу. Текущий и извлечь такие вещи, как Name, ProcessId.

Хотя это может быть то, что вы уже поняли, следующий код должен помочь вам получить имя класса текущего элемента пользовательского интерфейса, однако он НЕ является частью класса AutomationElement и является ловушкой Win32.

[DllImport("User32.dll")]
    public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

private string GetClassName(IntPtr hWnd)
    {
        StringBuilder sb = new StringBuilder(256);
        this.GetClassName(hWnd, sb, 256);
        return sb.ToString();
    }

Надеюсь, это поможет, хотя бы для начала;)

RH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...