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 ищу два окна редактирования. Есть два очевидных способа сделать это:

  1. Вызов EnumChildWindows перечислить всех детей subWin, Вам нужно будет предоставить функцию обратного вызова для этого. Это вполне возможно в VBA, но требует большей сложности, чем ваш текущий код.
  2. использование GetWindow ходить по детям subWin, Проходить GW_CHILD по первому звонку, чтобы получить первого ребенка. Затем позвоните снова, передавая последнего ребенка и GW_HWNDNEXT, Продолжай звонить GetWindow пока вы не нашли свои окна.
Другие вопросы по тегам