Как проверить, работает ли программа в локальной консоли?

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

  •  04-07-2019
  •  | 
  •  

Вопрос

В Windows Server 2003, как я могу проверить, работает ли моя программа в локальной консоли (" на экране серверного компьютера?) вместо удаленного сеанса?

Я использую Delphi Win32, поэтому любой метод, основанный на Windows API, должен работать.

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

Решение

Не скажет ли вам номер сессии?

ProcessIdToSessionId (GetCurrentProcessId (), & amp; dwSessionNum)

Вам также нужно проверить версию ОС, используя GetVersionEx: для всего, вплоть до XP / Server 2003, сеанс 0 является локальным (сервис или интерактивная консоль), все, что выше, является виртуальным. Для Vista / 2008 сеансы 0 и 1 являются локальными (0 - сервис, 1 - консоль), все остальное - виртуальное.

Я предполагаю, что ваши модули Delphi объявят номер сеанса как var, поэтому вам не понадобится амперсанд.

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

WTSGetActiveConsoleSessionId () должен вернуть Идентификатор сеанса, прикрепленного к консоли. Затем вы можете сравнить этот идентификатор сеанса с текущим идентификатором сеанса вашего приложения, чтобы определить, работаете ли вы на консоли или нет. Vista (не уверенная в Windows Server 2008) не обязательно дает сеансу консоли идентификатор 1 (быстрое переключение пользователей, кто-нибудь?).

Для меня ProcessIdToSessionId вернул 0 как при запуске непосредственно на физической консоли, так и при входе в административный сеанс (mstsc / admin).

Однако, когда вы входите через RDP, Windows (в данном случае XP Pro) создает новый сеанс, который он показывает на физической консоли, который имеет только «этот компьютер заблокирован». дисплей. WTSGetActiveConsoleSessionId возвращает идентификатор сеанса для второго сеанса, который в моем случае был равен 2.

Таким образом, несмотря на то, что ваше приложение работает на консоли, теперь есть два сеанса консоли, а ваше приложение не работает на активном. В моем коде я сравниваю идентификатор сессии вместо 0.

Брайан прав, с тех пор я столкнулся с Vista, сообщающей идентификатор сеанса 2 для интерактивной консоли, несмотря на то, что быстрое переключение пользователей не использовалось. Конечно, это может быть просто ошибкой: -)

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