我的程序可以確定在遠程桌面(終端服務)上運行的方式嗎?確定程序是否在遠程桌面上運行
我想在遠程桌面會話上運行程序時啓用「非活動超時」。由於用戶因遠程桌面會話打開而臭名昭着,我希望我的程序在指定的閒置時間後終止。但是,我不希望爲非RD用戶啓用非活動超時。
我的程序可以確定在遠程桌面(終端服務)上運行的方式嗎?確定程序是否在遠程桌面上運行
我想在遠程桌面會話上運行程序時啓用「非活動超時」。由於用戶因遠程桌面會話打開而臭名昭着,我希望我的程序在指定的閒置時間後終止。但是,我不希望爲非RD用戶啓用非活動超時。
GetSystemMetrics的(SM_REMOTESESSION)(如http://msdn.microsoft.com/en-us/library/aa380798.aspx描述)
這裏的C#託管代碼我使用:
/// <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);
}
但是通常不用於任何進程ID。
如果您想了解任何可以在任意會話中運行的任意進程,那麼您可以使用下面的方法。
您可以先通過調用ProcessIdToSessionId將進程ID轉換爲會話ID。一旦你有會議ID,你可以用它來呼叫: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);
}
什麼情況會導致進程處於不同的會話?這是如果我問服務,或處理其他登錄用戶下運行? – 2010-08-16 17:56:52