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
我试图 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