Приложение с графическим интерфейсом, созданное из службы LocalSystem (через CreateProcessAsUser), не имеет фокуса.

StackOverflow https://stackoverflow.com/questions/860428

Вопрос

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

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

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

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

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


Обновлять:

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

Вы можете изменить поведение, установив:win32gui.systemparametersinfo (win32con.spi_setforegroundlockimeout, 0, 0), что эквивалентно временно установить значение реестра:Hkey_current_user Control Panel Desktop Foregroundlocktimeout Это должно быть сделано в качестве самого пользователя, поэтому либо создайте его в приложении, которое вы запускаете, либо создайте вспомогательного вспомогательного приложения для приложения, которое вы хотите запустить.

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

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

Хотя для данной конкретной задачи вполне хватило настройки locktimeout.

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

Это было полезно?

Решение 2

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top