Как получить Active ChildWindow приложения? - PullRequest
1 голос
/ 06 мая 2009

У меня есть эта проблема. У меня есть обработчик главного окна определенного приложения, и я хочу смоделировать нажатие клавиши в этом приложении ...

Я использую 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, но мне не повезло ..

Кто-нибудь может пролить свет на эту проблему? Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 мая 2009

Вы можете использовать GetGUIThreadInfo, чтобы получить информацию об интерфейсе конкретного процесса.

Если у вас есть главное окно, вы можете вызвать GetWindowThreadProcessId, чтобы получить идентификатор потока процесса. Затем вы можете позвонить GetGUIThreadInfo, чтобы получить информацию об активных / сфокусированных окнах и т. Д.

Я также должен отметить, что некоторые приложения имеют только одно окно, и все его элементы управления без окон (например, Windows Live Messenger).

0 голосов
/ 07 мая 2009

Если приложение нарушает правила окон Windows, вам потребуется исключение.

В Mozilla это так (IIRC):

  • Это окно 'god' класса MozillaUIWindowClass и со строкой "- Mozilla Firefox" в тексте окна.
  • Если вам известна позиция адресной строки, вы можете использовать следующую функцию:

И предоставьте ему HWND окна 'бога' и положение адресной строки.

HWND ChildWindowFromPoint(HWND, POINT);

Возможно, есть лучшее решение, я придумал это, поскольку мне нужно было автоматизировать мышь, которая основана на позициях.

Для получения дополнительной информации вам может понадобиться обратиться к источникам определенного программного обеспечения или провести весь день в Spy +. :>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...