VB.NET - 我无法管理这个 window - Win32 - FindWindowEx

VB.NET - I can't manage this window - Win32 - FindWindowEx

我试图 select 在系统进程中 window 但它 returns 什么都没有。

这是我要获取的 window:

下面的代码有什么问题?

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 

您的代码存在一些问题。

  • 您要查找的编辑器window是一个MDI child,因此您需要获取其parent的HWND MDIClient window 首先,你没有做。

  • 在最后的 FindWindowEx() 调用中,您在 lpszClass 参数而不是 lpszWindow 参数中传递编辑器的文本。

  • 您不能总是将 child window 传递给 SetForegroundWindow()。因为您知道编辑器是一个 MDI child,您应该指示 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