2009-05-06 2 views
1

У меня есть эта проблема. У меня есть обработчик 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, но у меня не было никакой удачи ..

Любой может поставить некоторый свет на этот вопрос? Спасибо!

ответ

0

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

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

  • Там в это окно «бога» класса MozillaUIWindowClass и с «- Mozilla Firefox» строка в его окне текста.
  • Если вы знаете позицию в адресной строке, вы можете использовать следующую функцию:

и обеспечивают его с HWND окна «Бог» и положение в адресной строке.

HWND ChildWindowFromPoint(HWND, POINT); 

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

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

0

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

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

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