2008-10-01 57 views
22

我的程序可以确定在远程桌面(终端服务)上运行的方式吗?确定程序是否在远程桌面上运行

我想在远程桌面会话上运行程序时启用“非活动超时”。由于用户因远程桌面会话打开而臭名昭着,我希望我的程序在指定的闲置时间后终止。但是,我不希望为非RD用户启用非活动超时。

回答

10

这里的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; 
    } 
} 
5

下面的作品,如果你想了解你的应用程序,它是在你的会话中运行:

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); 
} 
+0

什么情况会导致进程处于不同的会话?这是如果我问服务,或处理其他登录用户下运行? – 2010-08-16 17:56:52

相关问题