Как мне найти дескриптор окна для запущенного процесса?

Я пытаюсь получить дескриптор окна из процесса. Теперь этот процесс показывает экран-заставку, поэтому, если я попробую ProcessInstance.MainWindowHandle, все, что я получу, - это дескриптор главного окна этого процесса, то есть экран-заставка.

Как мне найти нужное окно? Может быть, если бы я мог получить список окон, которые есть в этом процессе, я мог бы выбрать то, которое мне нужно.

Вот код, который я пытаюсь:

AutomationElement aeProcessInstance =
  AutomationElement.FromHandle(mProcess.MainWindowHandle);

AutomationElement aeButton = aeProcessInstance.FindFirst(
  TreeScope.Descendants,
  new PropertyCondition(AutomationElement.NameProperty, "Start"));

aeButton.SetFocus();
Thread.Sleep(1000);
SendKeys.SendWait("{ENTER}");

person Joao Carlos    schedule 24.02.2010    source источник
comment
Похоже на этот вопрос с ответом: stackoverflow.com/questions/79111/   -  person Sameh Deabes    schedule 25.02.2010


Ответы (2)


Это сложная задача. Приложение может иметь любое количество окон верхнего уровня. Они могут приходить и уходить по мере работы приложения.

Я вижу, вы используете SendKeys - вы пишете систему автоматизации или тестовую систему? Если это так, вы можете посмотреть принятый ответ на этот вопрос..

Не могли бы вы лучше объяснить, что вы пытаетесь сделать? Например, вы работаете со случайными приложениями? Или вы контролируете целевой процесс?

Обновлять

Хорошо, ваша дополнительная информация означает, что эта проблема более разрешима. Вам необходимо использовать отладчик Spy ++ или Xperf, Process Explorer или какой-либо другой инструмент для анализа поведения окон и потоков.

Как только вы это узнаете, вы сможете использовать различные Управление окнами функции, чтобы найти нужное окно и разобраться с ним.

Также помните о механизме целостности Windows. Приложение, которое вы используете для поиска окон в другом процессе и отправки им сообщений, должно иметь более высокий уровень целостности (IL), чем управляемое приложение.

person Foredecker    schedule 24.02.2010
comment
Я не работаю со случайными приложениями, это конкретное приложение, и логика управления жестко запрограммирована для этого конкретного приложения. Но это не мое приложение, поэтому я не могу его контролировать (под контролем я имею в виду исходный код). Я пишу автоматизацию, в основном то, что она делает, проверяет, запущен ли процесс, если он запущен, нажмите кнопку «Начать» в нем ... если он не запущен или не отвечает, перезапустите его. Это для веб-сервера, как приложение, которое иногда имеет тенденцию к сбою, и мне нужно найти способ (читай: взломать), чтобы заставить его действительно работать xD - person Joao Carlos; 24.02.2010
comment
На самом деле, я хочу использовать C #, потому что я планирую добавить больше функций, тем не менее, я не хочу изучать AutoIt или что-то еще только потому, что я не могу найти способ перечислить окна процесса: / - person Joao Carlos; 24.02.2010

Если вы знаете идентификатор потока пользовательского интерфейса в процессе, вы можете узнать, какими окнами владеет этот поток, установив EnumThreadWindows.

Функция EnumThreadWindows перечисляет все не дочерние окна, связанные с потоком, передавая дескриптор каждого окна, в свою очередь, функции обратного вызова, определяемой приложением. EnumThreadWindows продолжается до тех пор, пока последнее окно не будет перечислено или функция обратного вызова не вернет FALSE. Чтобы перечислить дочерние окна конкретного окна, используйте функцию EnumChildWindows.

Если в приложении не отображаются какие-либо диалоговые окна, это должно дать вам окно верхнего уровня. Если у него есть диалоговые окна, вам нужно будет использовать свойства окон, чтобы выяснить, какое окно является окном приложения. Обычно для этого подходят оконные стили.

person John Knoeller    schedule 24.02.2010