Сессия 0 Изоляция
Vista выпускает новую защиту, предотвращающую доступ Session 0 к оборудованию, такому как видеокарта, и пользователь больше не входит в сеанс 0. Я знаю, что это означает, что я не могу показать пользователю графический интерфейс, однако это также означает, что я не могу показать один на всех? То, как мой код настроен прямо сейчас, было бы больше работы, чтобы сделать его только командной строкой, однако, если бы я мог использовать свой существующий код и просто программно управлять GUI, это заняло бы намного меньше кода.
Это возможно?
Статья из MSDN гласит:
• Служба пытается создать пользовательский интерфейс (например, диалоговое окно) в сеансе 0. Поскольку пользователь не работает в сеансе 0, он или она никогда не видит пользовательский интерфейс и, следовательно, не может предоставить информацию о том, что служба находясь в поиске. Служба перестает функционировать, поскольку ожидает ответа пользователя, который не происходит.
Это заставляет меня думать, что возможно иметь автоматический пользовательский интерфейс, но кто-то сказал мне, что вы не можете использовать SendKeys со службой, потому что она была отключена в сеансе 0.
РЕДАКТИРОВАТЬ: мне на самом деле не нужно показывать пользователю графический интерфейс
3 ответа
Вы можете показать один; это просто не появляется.
На панели задач есть небольшое уведомление о том, что есть окно с графическим интерфейсом и способ переключения на него.
Во всяком случае, на самом деле есть команда API TerminalServices для переключения активного сеанса, который вы могли бы вызвать, если вам действительно нужно, чтобы он появился.
Вы можете написать отдельный процесс, который предоставляет пользовательский интерфейс для вашего процесса обслуживания. Связь между вашим пользовательским интерфейсом и процессом обслуживания может осуществляться различными способами (поиск в Интернете для "межпроцессного взаимодействия" или "IPC").
Ваш сервис может иметь графический интерфейс. Просто ни один человек не увидит этого. Как следует из цитаты MSDN, сервис может отображать диалоговое окно. Призыв к MessageBox
не подведет; он просто никогда не вернется - никто не будет нажимать на его кнопки.
Я не уверен, что вы имеете в виду, говоря о "управлении графическим интерфейсом". Вы действительно хотите притворяться, что отправляете входные данные элементам управления, как с SendInput
? Я не вижу причин, по которым это было бы невозможно; в конце концов, вы будете вводить данные в очередь вашей собственной программы и SendInput
Предупреждения, относящиеся к Vista, ничего не говорят об этом. Но я думаю, что вы будете делать вещи намного сложнее, чем нужно. Пересмотрите идею изменить вашу программу, чтобы вообще не иметь пользовательского интерфейса. (Это не то же самое, что иметь консольную программу. Консоли - это пользовательский интерфейс.)
Например, вместо того, чтобы имитировать сообщения мыши, необходимые для нажатия кнопки, исключите посредника и просто вызовите непосредственно функцию, которую вызвало бы событие нажатия кнопки.