У меня есть эта проблема. У меня есть обработчик mainWindow определенного приложения, и я хочу имитировать нажатие на этом приложении ...Как получить Active ChildWindow приложения?
Я использую вызовы sendMessage/postMessage api для этого. Причина, по которой я не использую функцию .Net SendKeys или keybd_event из win32 api, заключается в том, что они имитируют нажатия клавиш на глобальном уровне. В моем случае, возможно, приложение может быть сведено к минимуму и все еще хочет, чтобы нажатие клавиши было смоделировано.
Проблема с sendMessage и postMessage заключается в том, что вы должны передать обработчик точного дочернего окна, в котором вы хотите нажать клавишу. Например, в блокноте, если я отправлю ключ в mainWindow, ничего не происходит, я должен отправить ключ в дочернее окно, которое в основном состоит из белого холста, где вы можете писать.
С помощью msPaint, например, если пользователь создает новый документ и открывает текстовое поле на этом чертеже, и я хочу имитировать нажатие клавиши, я должен получить дочернее окно дочернего окна основного окна, чтобы он работал ,
Итак, я нашел способ, который, казалось, работал для каждой ситуации, в основном, я использовал getWindow с параметром GW_CHILD, чтобы получить дочернее окно с наивысшим значением z. Затем я делаю это снова для дочернего окна и продолжаю делать это до тех пор, пока у определенного дочернего окна не будет больше childWindows.
И это, казалось, сработало, и я был очень счастлив!
Однако ... Я нашел случаи, когда это не работает. Firefox является одним из них. Firefox имеет mainWindow, а затем имеет дочернее окно, которое почти так же, как и mainWindow, а затем имеет еще одно дочернее окно, которое представляет собой область веб-сайта, т. Е. Область под адресной строкой и меню. Например, если я на www.google.com, и я хочу имитировать нажатие клавиши в сфокусированном поле поиска, это работает, потому что получение дочернего окна дочернего окна дает мне правильный childWindow. Однако, если пользователь нажимает на адресную строку, например, ничего не меняется в способе работы getWindow. Он все равно в конечном итоге получит дочернее окно, которое находится под адресной строкой, ничего не делая, вместо симуляции нажатия клавиши в адресной строке.
Дело в том, что я не нашел способ получить активное дочернее окно определенного приложения. Я могу использовать только метод GetWindow, чтобы получить дочернее окно определенного окна и сделать это, пока не найду дочернее окно без дочерних элементов. Однако, как вы видели в случае firefox, активное окно на самом деле является родителем дочернего окна, которое я получаю в конце.
Я пробовал другие вызовы API, как getTopWindow, но у меня не было никакой удачи ..
Любой может поставить некоторый свет на этот вопрос? Спасибо!