2016-01-21 265 views
0

我正在写一个VBA在第三方程序中写入文本。 在“subwin” - “wxWindowNR”下有两个窗口类名称,其名称相同。VBA winapi findwindowEx - 发送文本到相同的类处理程序名称

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

我怎么能发送文字到第二“编辑?

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 

回答

0

FindWindowEx是这里的工作错误的工具。无论你寻找具有相同的类名的窗口,并自。窗口文本是不可预测的,FindWindowEx是不恰当的

相反,你需要遍历的subWin孩子找两个编辑窗口有两个明显的方式来做到这一点:

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