Ответ 1
GetSystemMetrics (SM_REMOTESESSION) (как описано в http://msdn.microsoft.com/en-us/library/aa380798.aspx)
Есть ли способ, который моя программа может определить при запуске на удаленном рабочем столе (службы терминалов)?
Я хотел бы включить "таймаут бездействия" в программе, когда он запускается на сеансе удаленного рабочего стола. Поскольку пользователи, как известно, оставляют сеансы удаленного рабочего стола открытыми, я хочу, чтобы моя программа завершилась после определенного периода бездействия. Но я не хочу, чтобы тайм-аут бездействия был включен для пользователей, не относящихся к RD.
GetSystemMetrics (SM_REMOTESESSION) (как описано в http://msdn.microsoft.com/en-us/library/aa380798.aspx)
Здесь используется управляемый код С#:
/// <summary>
/// Indicates if we're running in a remote desktop session.
/// If we are, then you MUST disable animations and double buffering i.e. Pay your taxes!
///
/// </summary>
/// <returns></returns>
public static Boolean IsRemoteSession
{
//This is just a friendly wrapper around the built-in way
get
{
return System.Windows.Forms.SystemInformation.TerminalServerSession;
}
}
Следующее работает, если вы хотите узнать о своем приложении, которое работает в вашей сессии:
BOOL IsRemoteSession(void)
{
return GetSystemMetrics( SM_REMOTESESSION );
}
Но не в общем случае для любого идентификатора процесса.
Если вы хотите узнать о любом произвольном процессе, который может выполняться в любом произвольном сеансе, вы можете использовать метод ниже.
Вы можете сначала преобразовать идентификатор процесса в идентификатор сеанса, вызвав ProcessIdToSessionId. После того, как у вас есть идентификатор сеанса, вы можете использовать его для вызова: WTSQuerySessionInformation. Вы можете указать WTSInfoClass
как значение WTSIsRemoteSession
, и это даст вам информацию о том, является ли это приложение удаленным рабочим столом или нет.
BOOL IsRemoteSession(DWORD sessionID)
{
//In case WTSIsRemoteSession is not defined for you it is value 29
return WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionID, WTSIsRemoteSession, NULL, NULL);
}