Как определить, есть ли в приложении элементы пользовательского интерфейса из C # в Windows 7? - PullRequest
1 голос
/ 04 мая 2010

У меня есть приложение c # в Windows 7, которое работает в сеансе 0. Это приложение в основном является структурой для установки исправлений программного обеспечения, которая будет устанавливать исправления в фоновом режиме (в сеансе 0).

Таким образом, это приложение загрузит исправления с сервера и начнет устанавливать их на клиентские машины. Он устанавливает патчи, вызывая CreateProcess («Patch.exe»).

В настоящее время Patch.exe, в основном, будет неинтерфейсной установкой без участия пользователя, и впредь установка патча из сеанса 0 проходит успешно.

Однако иногда в этом Patch.exe есть некоторые элементы пользовательского интерфейса, такие как запрос пользователя о некоторых деталях (например, место установки и т. Д.), И допустим, что нельзя избежать этих элементов пользовательского интерфейса.

Так может ли моя инфраструктура установки (которая выполняется в сеансе 0, написанная на C #) знать, что процесс Patch.exe, который был создан моей платформой, содержит какие-либо элементы пользовательского интерфейса?

Причина, по которой я спрашиваю, состоит в том, что, если я определю, что в приложении есть какие-либо элементы пользовательского интерфейса, я не хочу продолжать установку (грубый способ сделать это - убить процесс установки Patch.exe, но это уже другая история, и здесь это не касается).

Ответы [ 2 ]

2 голосов
/ 04 мая 2010

Вы можете использовать EnumWindows API-функцию для перебора каждого окна и проверки его принадлежности к вашему экземпляру Patch.exe, вызвав GetWindowThreadProcessId (при условии, что вы создали процесс для Patch.exe и у него есть PID) , Вы можете применить эту проверку, вызвав GetWindowLong с аргументом GWL_STYLE и проверив, установлен ли в результирующем стиле бит WS_VISIBLE. Некоторые приложения могут создавать скрытые окна для выполнения действий, которые на самом деле не связаны с пользовательским интерфейсом.

В качестве альтернативы вы можете использовать SetWinEventHook с аргументом EVENT_OBJECT_CREATE для получения уведомлений при каждом создании нового окна. Затем вы можете выполнить проверку, как описано выше.

2 голосов
/ 04 мая 2010

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

Для .NET вы, вероятно, можете определить, ссылается ли он на сборку System.Windows.Forms.

Ни одно из них не было бы идеальным решением. Лучшим решением будет принудительно установить политику, при которой исправления никогда не должны отображать пользовательский интерфейс (или могут принимать командную строку для подавления любого пользовательского интерфейса). Но я предполагаю, что это невозможно здесь.

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