Как узнать, является ли подключенная оконная станция интерактивной? - PullRequest
1 голос
/ 18 декабря 2009

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

Ответы [ 3 ]

5 голосов
/ 18 декабря 2009

Станция интерактивного окна всегда winsta0 . Таким образом, вам нужно получить название оконной станции, чтобы определить его. Вот некоторый псевдокод:

wchar_t buffer[256] = {0};
DWORD length = 0;
GetUserObjectInformation(GetProcessWindowStation(), UOI_NAME, buffer, 256, &length);
if (!lstrcmp(buffer, "winsta0")) {
  // Interactive!
}

С http://msdn.microsoft.com/en-us/library/ms687096(VS.85).aspx:

Интерактивная оконная станция Winsta0 - единственная оконная станция, которая может отображать пользовательский интерфейс или принимать пользовательский ввод

0 голосов
/ 19 декабря 2009

Обратите внимание, что это работает только в Windows XP (и только иногда) - в Windows Vista и более поздних версиях службы запускаются в отдельном сеансе от интерактивных пользователей, поэтому вы никогда не сможете подключиться к консоли в этих ОС. .

Кроме того, в Windows XP ваше приложение не будет работать, если на компьютере несколько пользователей (быстрое переключение пользователей), поскольку только первый пользователь вошел в сеанс 0 (где работают службы).

Было бы гораздо лучше разделить свой сервис на две части: службу, выполняющую работу, и небольшой фрагмент кода, выполняемый как задача (с помощью API планировщика задач Win32), который выполняет пользовательский интерфейс.

0 голосов
/ 18 декабря 2009

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

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