VBA winapi findwindowEx - отправить текст с тем же именем обработчика класса
Я пишу VBA для написания текста в сторонней программе. Есть 2 окна класса имени с одинаковым именем "Редактировать" под "subwin" - "wxWindowNR".
Я могу отправить сообщение первому "Редактировать", но не второму.
Как я могу отправить текст на второй "Редактировать?
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 ответ
FindWindowEx
это неправильный инструмент для работы здесь. Оба окна, которые вы ищете, имеют одно и то же имя класса, и так как текст окна непредсказуем, FindWindowEx
не подходит
Вместо этого вам нужно перебрать детей subWin
ищу два окна редактирования. Есть два очевидных способа сделать это:
- Вызов
EnumChildWindows
перечислить всех детейsubWin
, Вам нужно будет предоставить функцию обратного вызова для этого. Это вполне возможно в VBA, но требует большей сложности, чем ваш текущий код. - использование
GetWindow
ходить по детямsubWin
, ПроходитьGW_CHILD
по первому звонку, чтобы получить первого ребенка. Затем позвоните снова, передавая последнего ребенка иGW_HWNDNEXT
, Продолжай звонитьGetWindow
пока вы не нашли свои окна.