VB. NET - Я не могу управлять этим окном - Win32 - FindWindowEx - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь выбрать окно в системном процессе, но оно ничего не возвращает.

Вот окно, которое я пытаюсь получить:

enter image description here

Что не так с кодом ниже?

Sub Find_Window

    Dim Profit As Integer = Win32.FindWindow(Nothing, "ProfitPro - 5.0.0.35 - Registrado"
    Dim Menu As Integer = Win32.FindWindowEx(Profit, Nothing, "Editor de Estratégias", Nothing)

    If (Not Menu = 0) Then
        Win32.SetForegroundWindow(Menu)
        SendKeys.Send("{TAB}")
    End If

End Sub 

1 Ответ

0 голосов
/ 27 марта 2020

Есть несколько проблем с вашим кодом.

  • окно редактора, которое вы ищете, является дочерним MDI, поэтому вам нужно получить HWND его родителя MDIClient окно первое, чего вы не делаете.

  • в вашем последнем вызове FindWindowEx() вы передаете текст редактора в параметре lpszClass вместо параметра lpszWindow.

  • вы не всегда можете передать дочернее окно в SetForegroundWindow(). Поскольку вы знаете, что редактор - это ребенок MDI, вам следует дать MDI указание сосредоточиться на редакторе, если это именно то, что вы пытаетесь сделать.

Попробуйте вместо этого:

Sub Find_Window

    Dim Profit As IntPtr = Win32.FindWindow("TProfitChartForm", "ProfitPro - 5.0.0.35 - Registrado")
    Dim MDI As IntPtr = Win32.FindWindowEx(Profit, IntPtr.Zero, "MDIClient", "")
    Dim Editor As IntPtr = Win32.FindWindowEx(MDI, IntPtr.Zero, "TLanguageEditorForm", "Editor de Estratégias")

    If Editor <> 0 Then
        Win32.SetForegroundWindow(Profit)
        Win32.SendMessage(MDI, WM_MDIACTIVATE, Editor, 0)
        ' TODO: add this
        ' Dim ChildTextFieldInsideOfEditor as IntPtr = Win32.FindWindowEx(Editor, ...)
        ' Dim ThisThreadId = Win32.GetCurrentThreadId()
        ' Dim EditorThreadId as Integer = Win32.GetWindowThreadProcessId(Editor, ref ProcID)
        ' Win32.AttachThreadInput(ThisThreadId, EditorThreadId, True);
        ' Win32.SetFocus(ChildTextFieldInsideOfEditor)
        ' Win32.AttachThreadInput(ThisThreadId, EditorThreadId, False);
        SendKeys.Send("{TAB}")
    End If

End Sub 
...