Как проверить, запущен ли внешний процесс WPF или другой процесс? - PullRequest
0 голосов
/ 27 февраля 2012

Я написал «оболочку» на основе WPF / C #, которая запускает приложения WPF или другие приложения.

Каков наилучший способ проверки, если процесс наконец полностью запущен или больше не "занят"«?Я заметил, что курсор мыши для запущенного процесса остается на занятом курсоре с момента первоначального запуска, пока я наконец не смогу увидеть пользовательский интерфейс для процесса.Могу ли я использовать User32.SetCapture API, чтобы установить захват мыши для внешнего процесса, а затем как-нибудь проверить, является ли курсор мыши занятым курсором?Или, возможно, в классе System.Diagnostics.Process есть механизм, о котором я не знаю?

Поскольку некоторые из запущенных приложений являются предварительно скомпилированными сторонними приложениями, я абсолютно не могу реализовать механизм во внешнемобрабатывает сообщение, если оно наконец готово, например: Microsoft PowerPoint 2010 Viewer, Adobe Acrobat или Adobe Flash Player Standalone.

Я не могу просто проверить, был ли создан процесс, потому что у меня естьпустое, не отвечающее окно и занятый курсор.Я надеюсь скрыть свое приложение WPF в тот момент, когда завершится запуск внешнего процесса.

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Функция WaitForInputIdle Win32 APi будет ожидать, пока данный процесс не войдет в цикл обработки сообщений (без ожидания ввода).

Цитата: "Прежде чем пытаться связаться с дочерним процессом, родительский процесс может использовать функцию WaitForInputIdle, чтобы определить, когда инициализация дочернего процесса была завершена."

Вы можете позвонить через P / Invoke.

0 голосов
/ 27 февраля 2012

Не очень понятно, что вы имеете в виду, говоря "beasy", но выслушайте несколько соображений:

Не существует известного (ясного) способа, по крайней мере, который я знаю, который может позволить вам сделатьчто-то вроде того.Дело в том, что process является прекрасно изолированным ядром ОС гражданина.Таким образом, вы не можете написать что-то, что работает для всех типов процессов, особенно если они являются бинарными файлами третьей части.

Что вы можете попробовать сделать, это получить MainWindow процесса (если есть), получить его handle и фильтровать OS сообщения, пока вы не получитенапример WM_ACTIVATED.

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

Давайте посмотрим, что другие предлагают, на мой взгляд, нетуниверсальное и не единственное решение для покрытия меньшинства возможных случаев.

Удачи

...