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