Как получить скрытый / закрытый элемент пользовательского интерфейса из UIAutomation, я вижу его в Spy ++, но не могу найти его в коде, только его родители и братья и сестры - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь использовать System.Windows.Automation для доступа к элементу пользовательского интерфейса в медиаплеере VLC (в частности, в поле состояния в крайнем левом углу, которое показывает имя файла воспроизводимого в данный момент видео). Я могу получить родительский элемент и элемент родного элемента, но в Spy ++ все элементы, у которых есть затемненный значок, недоступны в коде ... Я предполагаю, что затемненный значок означает, что они закрыты или скрыты или что-то в этом роде , Вот изображение, показывающее, что я имею в виду:

enter image description here

Обратите внимание, что у меня есть ссылка на родителя с дескриптором 0x30826, и я выполняю FindAll () * для этого и в результате получаю только один результат - ссылку на дочерний элемент с дескриптором 0x30858. Вы можете видеть, что в Spy ++ есть 5 детей 0x30826, но только один из них, тот, который я получаю, когда делаю FindAll, имеет полностью черный значок, остальные имеют серый значок, и я не могу к ним добраться. Обратите также внимание, что я хочу 0x20908, и у него есть серый значок ...

Как я могу получить это в коде?

* Это код, который я использую, чтобы получить всех детей 0x30826:

    Dim aeDesktop As AutomationElement
    Dim aeVLC As AutomationElement
    Dim c As AutomationElementCollection
    Dim cd As New AndCondition(New PropertyCondition(AutomationElement.IsEnabledProperty, True), New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.StatusBar))

    aeVLC = aeDesktop.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.NameProperty, "got s01e01.avi - VLC media player"))

    c = aeVLC.FindAll(TreeScope.Children, cd)

    c = c(0).FindAll(TreeScope.Children, Condition.TrueCondition)

Первый FindAll () дает мне только 0x30826, что хорошо, потому что это то, что я хочу, но второй FindAll, без заданных условий, дает только 0x30858, когда я вижу это плюс 4 других в Spy ++, включая тот, который Я хочу.

1 Ответ

1 голос
/ 02 апреля 2019

Вы действительно мешаете своим усилиям, используя Spy ++ вместо Inspect Program . Используя Inspect, вы можете легко увидеть, что целевой элемент представляет собой элемент text , связанный с элементом строки состояния , который связан с основным элементом window .

VLC in Inspect

Используя эту информацию, получить ссылку на целевой элемент text просто. Начните с получения главного окна, затем его строки состояния и, наконец, первого текстового элемента строки состояния.

' find the VLC process 
Dim targets As Process() = Process.GetProcessesByName("vlc")

If targets.Length > 0 Then

    ' assume its the 1st process 
    Dim vlcMainWindowHandle As IntPtr = targets(0).MainWindowHandle

    ' release all processes obtained
    For Each p As Process In targets
        p.Dispose()
    Next

    ' use vlcMainWindowHandle to get application window element
    Dim vlcMain As AutomationElement = AutomationElement.FromHandle(vlcMainWindowHandle)

    ' get the statusbar
    Dim getStatusBarCondition As Condition = New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.StatusBar)
    Dim statusBar As AutomationElement = vlcMain.FindFirst(TreeScope.Children, getStatusBarCondition)

    ' get the 1st textbox in the statusbar
    Dim getTextBoxCondition As Condition = New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Text)
    Dim targetTextBox As AutomationElement = statusBar.FindFirst(TreeScope.Children, getTextBoxCondition)

    ' normally you use either a TextPattern.Pattern or ValuePattern.Pattern
    ' to obtain the text, but this textbox exposes neither and it uses the
    ' the Name property for the text.

    Dim textYouWant As String = targetTextBox.Current.Name

End If
...