0

我试图在系统进程中选择一个窗口,但它什么也没返回。

这是我想要得到的窗口:

在此处输入图像描述

下面的代码有什么问题?

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 
4

1 回答 1

0

您的代码存在一些问题。

  • 您要查找的编辑器窗口是 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 
于 2020-03-27T00:46:15.407 回答