Приложение с графическим интерфейсом, порожденное из LocalSystem Service (через CreateProcessAsUser), не имеет фокуса - PullRequest
1 голос
/ 14 мая 2009

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

Этот экран-заставка, после ввода действительного кода, сообщит об этом службе, и служба переходит в режим ожидания на некоторое время (в зависимости от кода).

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

Это все работает, единственная проблема в том, что запущенное приложение не имеет фокуса, то есть, если я работаю в блокноте, а время истекло, заставка отображается (хотя и в полноэкранном режиме) за блокнотом.

Мне нужно беспокоиться только о Windows Vista, я пишу на Python с использованием расширений win32, но я считаю, что эта проблема заключается в CreateProcessAsUser при вызове из учетной записи LocalSystem.


Обновление:

«Проблема» на самом деле является преднамеренным ограничением, чтобы не допустить, чтобы «раздражающие» приложения, такие как мое, украли фокус.

Вы можете изменить поведение, установив: win32gui.SystemParametersInfo (win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0) что эквивалентно временной настройке значения реестра: HKEY_CURRENT_USER \ Панель управления \ Рабочий стол \ ForegroundLockTimeout Это должно быть сделано самим пользователем, поэтому либо создайте его в приложении, которое вы запускаете, либо создайте помощник для запуска приложения, которое вы хотите запустить.

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

Вероятно, хорошим решением было бы найти все дескрипторы окна в данный момент от этого пользователя, а затем использовать каждый из этих дескрипторов, чтобы использовать win32gui.ShowWindow (handle, command) для его минимизации.

Хотя для этой конкретной проблемы достаточно было установить время блокировки.

Если кому-то интересно, как мне удалось запустить приложение на рабочем столе из службы, вот ссылка на код .

Ответы [ 2 ]

2 голосов
/ 14 мая 2009

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

В остальном я считаю, что это атрибут wShowWindow из структуры STARTUPINFO, на который указывает lpStartupInfo, который должен им управлять. Вам также нужно STARTF_USESHOWWINDOW в dwFlags, чтобы использовать nShowWindow. Значения должны быть SW_SHOW, я думаю, они перечислены для функции ShowWindow, если вы хотите попробовать другое.

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

По различным вполне законным причинам Microsoft предпочла бы, чтобы служба не запускала приложение и не фокусировалась, однако я нашла следующую работу, которая по-прежнему позволяет достичь того, чего я хочу.

Первоначально предполагалось, что приложение, похожее на киоск, будет ограничено паролем, например, заставкой, которая после ввода 8-символьного кода закрывает заставку на некоторое время, как в определенном коде доступа. Первоначально фактическое используемое приложение было запущено из папки автозапуска.

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

...