В интересах тех, кто может столкнуться с подобной проблемой в будущем, я публикую свое решение, которое я использовал (хотя я хотел бы увидеть решение, предлагаемое с использованием EnumChildWindows, так как, похоже, это более элегантный подход,но я не достаточно разбираюсь в API, чтобы знать, как его настроить).
FindWindowEx не смог найти искомое окно элемента управления видео, которое я искал, потому что этот элемент управления был похоронен как дочерний элемент дочернего элементаребенок от ребенка ребенок от родителя.FindWindowEx будет искать только дочерние элементы непосредственно предшествующего родителя.Таким образом, вы должны вложить поиск для скрытого дочернего элемента управления.
Шаги, за которыми я следовал:
- Откройте целевое приложение, к окну которого и дочернему окну вам нужно получить доступ из VBA.
- Запустите Spyxx.exe (он же Spy ++)
- Используя инструмент «Найти окно», получите дескриптор, заголовок и класс дочернего оконного элемента управления, чья дескриптор вам нужен
- Запишитеэтих элементов, а затем закройте инструмент «Найти окно»
- Все еще используя Spyxx.exe, используйте пункт меню «Дерево / Сохранить дерево в файл ...» (или нажмите CTRL + S), чтобы сохранить дерево оконв текстовый файл (обратите внимание, что по умолчанию для сохранения сохраняется его как объект .sxt Spy ++, который вам здесь не нужен)
- Откройте список дереватекстового файла Windows, который вы сохранили в своем любимом текстовом редакторе (он был отформатирован для меня с помощью Notepad ++) и выполните поиск дескриптора окна, который вы отметили в шагах № 3 и № 4 выше
- Это должно найти ребенкаокно в дереве, которое вы хотите
- Теперь работайте в обратном направлении вверх по дереву, выполняя следующие шаги, пока не дойдете до дескриптора родительского окна.
- Запишите заголовок окна для следующего окна повышения уровня - заголовок заключен в двойные кавычки;эта надпись понадобится вам, когда вы напишите код VBA позже
- Теперь перейдите на следующий уровень окна вверх и запишите заголовок для этого окна
- Продолжайте перемещаться вверх по уровням окна, пока не дойдете дородительское окно для самого приложения
Последний шаг: теперь в коде VBA, чтобы найти дескриптор окна целевого дочернего оконного элемента управления, вам нужно будет вложить команды FindWindowExначиная с родительского окна и продвигаясь вниз по этому пути (замените «wxWindowNR» на любой класс окна, относящийся к дочернему элементу управления, который вы пытаетесь найти):
FindWindowEx (ParentWindowHandle, 0, "wxWindowNR", "[caption from steps 9 to 11]")
Например, вот кодЯ должен был использовать (где ChildWindow5 - дескриптор окна управления видео, которое я искал; команды While ... Wend необходимы, потому что в приложении, на которое я нацеливался, не все дочерние окна существовали сразу при запуске приложения):
ParentWindow = 0
While ParentWindow = 0
ParentWindow = FindWindow("Target Window Caption")
Wend
ChildWindow1 = 0
While ChildWindow1 = 0
ChildWindow1 = FindWindowEx(CLng(ParentWindow), 0, "wxWindowNR", "ID_BOOKMARK_SPLITTERWINDOW")
Wend
ChildWindow2 = 0
While ChildWindow2 = 0
ChildWindow2 = FindWindowEx(CLng(ChildWindow1), 0, "wxWindowNR", "ID_TOPPANEL_SPLITTERWINDOW")
Wend
ChildWindow3 = 0
While ChildWindow3 = 0
ChildWindow3 = FindWindowEx(CLng(ChildWindow2), 0, "wxWindowNR", "ID_MAINDISPLAY_PANEL")
Wend
ChildWindow4 = 0
While ChildWindow4 = 0
ChildWindow4 = FindWindowEx(CLng(ChildWindow3), 0, "wxWindowNR", "ID_VIDEODISPLAY_PANEL")
Wend
ChildWindow5 = 0
While ChildWindow5 = 0
ChildWindow5 = FindWindowEx(CLng(ChildWindow4), 0, "wxWindowNR", "panel")
Wend
Обратите внимание, что каждый последующий поиск дескриптора дочернего окна ссылаетсяces предыдущее родительское окно.
Это сработало для меня.Я все еще думаю, что если кто-то может указать, как это сделать с EnumChildWindows, решение, вероятно, будет гораздо более элегантным.