VBA winapi findwindowEx - 将文本发送到相同的类处理程序名称

时间:2016-01-21 16:38:15

标签: vba winapi findwindow

我正在写一个VBA来在第三方程序中写文本。 在“subwin” - “wxWindowNR”下有两个窗口类名,名称为“Edit”。

我可以向第一个“编辑”发送消息,但不能向第二个发送消息。

如何将文字发送到第二个“编辑?

Sub writeTextOnWin()
Dim i As Long
Dim wClass As Object

hWnd = FindWindow(vbNullString, "mkvmerge GUI")

start_doc = ShellExecute(hWnd, "open", "C:\Program Files\MKVToolNix\mmg.exe", "", 0, SW_NORMAL)

If start_doc = 2 Then Exit Sub
If start_doc = 3 Then Exit Sub

Do
DoEvents
hwindow2 = FindWindow(vbNullString, "mkvmerge GUI v7.7.0 ('Six Voices') 64bit")
Loop Until hwindow2 > 0


mainWin = FindWindowEx(hwindow2, 0&, "wxWindowNR", vbNullString)
subWin = FindWindowEx(subWin, 0&, "wxWindowNR", vbNullString)

editWin = FindWindowEx(subWin, 0&, "Edit", vbNullString)
editWin2 = FindWindowEx(subWin, 0&, "Edit", vbNullString)

Call SendMessageByString(editWin, WM_SETTEXT, 0, "hello")
Call SendMessageByString(editWin2, WM_SETTEXT, 1, "hello again")

end sub

1 个答案:

答案 0 :(得分:0)

FindWindowEx是这里工作的错误工具。您查找的两个窗口都具有相同的类名,并且由于窗口文本不可预测,FindWindowEx不合适。

相反,你需要遍历subWin的孩子,寻找两个编辑窗口。有两种明显的方法可以做到这一点:

  1. 致电EnumChildWindows以枚举subWin的所有子女。您需要为此提供回调函数。这在VBA中是完全可能的,但需要比当前代码更复杂。
  2. 使用GetWindow走过subWin的孩子。在第一次通话时通过GW_CHILD以获得第一个孩子。然后,再次呼叫通过最新的孩子和GW_HWNDNEXT。继续致电GetWindow,直到找到你的窗户。