24

有没有一种方法可以确定我的程序何时在远程桌面(终端服务)上运行?

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

4

3 回答 3

20

GetSystemMetrics(SM_REMOTESESSION)(如http://msdn.microsoft.com/en-us/library/aa380798.aspx中所述)

于 2008-10-01T21:53:17.097 回答
13

这是我使用的 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;
    }
}
于 2008-10-27T19:46:01.663 回答
6

如果您想了解在您的会话中运行的应用程序,则可以使用以下方法:

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-05-04T14:28:35.973 回答