Я создал службу, которая отображает своего рода заставку на рабочем столе определенного пользователя и только тогда, когда этот пользователь вошел в систему (пользователь киоска).
Этот экран-заставка, после ввода действительного кода, сообщит об этом службе, и служба переходит в режим ожидания на некоторое время (в зависимости от кода).
Заставка просто закрывается. Теперь, когда сервис просыпается, он видит, что всплеска больше нет, и поэтому запускаем его.
Это все работает, единственная проблема в том, что запущенное приложение не имеет фокуса, то есть, если я работаю в блокноте, а время истекло, заставка отображается (хотя и в полноэкранном режиме) за блокнотом.
Мне нужно беспокоиться только о Windows Vista, я пишу на Python с использованием расширений win32, но я считаю, что эта проблема заключается в CreateProcessAsUser при вызове из учетной записи LocalSystem.
Обновление:
«Проблема» на самом деле является преднамеренным ограничением, чтобы не допустить, чтобы «раздражающие» приложения, такие как мое, украли фокус.
Вы можете изменить поведение, установив:
win32gui.SystemParametersInfo (win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0)
что эквивалентно временной настройке значения реестра:
HKEY_CURRENT_USER \ Панель управления \ Рабочий стол \ ForegroundLockTimeout
Это должно быть сделано самим пользователем, поэтому либо создайте его в приложении, которое вы запускаете, либо создайте помощник для запуска приложения, которое вы хотите запустить.
Однако приложение может захотеть предотвратить кражу фокуса с помощью некоторого вызова API, который я сейчас не помню.
Вероятно, хорошим решением было бы найти все дескрипторы окна в данный момент от этого пользователя, а затем использовать каждый из этих дескрипторов, чтобы использовать win32gui.ShowWindow (handle, command) для его минимизации.
Хотя для этой конкретной проблемы достаточно было установить время блокировки.
Если кому-то интересно, как мне удалось запустить приложение на рабочем столе из службы, вот ссылка на код .