Откройте всплывающее окно из скрытого окна - PullRequest
0 голосов
/ 25 апреля 2020

Я разрабатываю инструмент на VB. NET для автоматизации некоторых задач другого приложения, однако я хотел бы сделать это скрытно. Я открываю редактор и затем через ShowWindow (Editor, SW_HIDE) скрываю его окно.

Проблема в том, что в этом редакторе есть кнопка «Сохранить как», которая открывает всплывающее окно для ввода имени и Нажмите Сохранить.

Когда редактор не скрыт, он работает отлично. Однако, когда редактор скрыт, всплывающее окно не загружается (я не могу найти его дескриптор).

Можно ли как-то выполнить эту задачу, желательно со скрытым всплывающим окном тоже?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

PS1: кнопку «Сохранить как» невозможно просмотреть в Spy ++, только когда я использую Inspect.

Стремясь понять разницу между ними, я нашел этот пост.

Чтение этот пост Я понял, что МСА не видит скрытых элементов.

Spy ++ and Inspect screens

Есть предложения для моего проекта?

Вот мой код:

Private Sub AtualizarGrafico()

Dim nomejanela As String = ""
    For Each p As Process In System.Diagnostics.Process.GetProcesses
        If (p.MainWindowTitle <> "") Or (p.MainWindowTitle <> " ") Then
            If Mid(p.MainWindowTitle, 1, 9) = "ProfitPro" Then
                nomejanela = p.MainWindowTitle
            End If
        End If
    Next

    If FindWindow(vbNullString, nomejanela) = False Then
        MsgBox("A Plataforma não está aberta.")
        Exit Sub

    End If

    Dim Profit As Integer = FindWindow(vbNullString, nomejanela) 'LEVEL 1
    Dim Container As Integer = Win32.FindWindowEx(Profit, vbNullString, "MDIClient", vbNullString) 'LEVEL 1.1
    Dim Editor As Integer = Win32.FindWindowEx(Container, vbNullString, "TLanguageEditorForm", vbNullString) ' LEVEL 1.1.1

    Win32.ShowWindow(Editor, Win32.SW_HIDE)
    Win32.SetForegroundWindow(Container)
    Win32.SendMessage(Container, Win32.WM_ACTIVATE, 0, 0)

    'Shortcut to open
    If Editor = 0 Then
        SendKeys.Send("^q")
    End If

    Dim EditorPainel As Integer = Win32.FindWindowEx(Editor, vbNullString, "TPanel", "EditorPanel") 'LEVEL 1.1.1.1
    Dim EditorIntraPainel As Integer = Win32.FindWindowEx(EditorPainel, vbNullString, "TPanel", "EditorInnerPanel") 'LEVEL 1.1.1.1.1.1
    Dim EditorEstrategia As Integer = Win32.FindWindowEx(EditorIntraPainel, vbNullString, "TLanguageEditor", "") 'LEVEL 1.1.1.1.1.1.1

    Dim Painel As Integer = Win32.FindWindowEx(Editor, Nothing, "TPanel", "") 'LEVEL 1.1.1.2
    Dim ToolBar As Integer = Win32.FindWindowEx(Painel, Nothing, "TTBToolBar", "ToolBar1") 'LEVEL 1.1.1.2.1

    'wait 'til load the form
    Thread.Sleep(1000)

    Win32.SetForegroundWindow(EditorEstrategia)
    Win32.SetActiveWindow(EditorEstrategia)

    SendKeys.SendWait("^{HOME}") '   
    SendKeys.SendWait("^+{END}") '  
    SendKeys.SendWait("{DEL}")
    SendKeys.SendWait("^v")

    'ROTINA PARA SALVAR

    'backSaveAs:
    Dim HandleBtnSalvarComo = AutomationElement.FromHandle(ToolBar)
    Dim FindSaveAs = HandleBtnSalvarComo.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.NameProperty, "Salvar como..."))
    Dim btnSaveAs As InvokePattern = DirectCast(FindSaveAs.GetCurrentPattern(InvokePattern.Pattern), InvokePattern)
    btnSaveAs.Invoke()

    Thread.Sleep(1000)

    Dim windowSaveAs As Integer = Win32.FindWindow(vbNullString, "Salvar Como") 'LEVEL 2
    Dim fieldNameSaveAs As Integer = Win32.FindWindowEx(windowSaveAs, vbNullString, "TEdit", vbNullString) 'LEVEL 2.1

    'VARIÁVEL DO NOME DA ESTRATÉGIA
    Win32.SendMessageT(fieldNameSaveAs, Win32.WM_SETTEXT, 0, numero_editor & "EE")

    Dim HandleBtnSave = AutomationElement.FromHandle(windowSaveAs)
    Dim FindSave = HandleBtnSave.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.NameProperty, "Salvar"))
    Dim btnSave As InvokePattern = DirectCast(FindSave.GetCurrentPattern(InvokePattern.Pattern), InvokePattern)
    Win32.ShowWindow(Editor, Win32.SW_SHOW)
    btnSave.Invoke()
End Sub
...