如何判断我的应用程序是否在RDP会话中运行

时间:2008-11-17 11:56:41

标签: .net winforms rdp

我有一个.net winforms应用程序,它有一些动画效果,淡入和滚动动画等。但这些工作正常,但如果我在远程桌面协议会话中动画开始感激。

有人可以建议一种方法来确定某个应用是否在RDP会话中运行,这样我可以在这种情况下关闭效果吗?

4 个答案:

答案 0 :(得分:20)

假设您至少使用的是.NET Framework 2.0,则无需使用P / Invoke:只需检查System.Windows.Forms.SystemInformation.TerminalServerSessionMSDN)的值即可。

答案 1 :(得分:7)

查看我提出的类似问题:How to check if we’re running on battery?

因为如果你使用电池运行,你也想禁用动画。

/// <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;    
    }
}

然后检查你是否使用电池运行:

/// <summary>
/// Indicates if we're running on battery power.
/// If we are, then disable CPU wasting things like animations, background operations, network, I/O, etc
/// </summary>
public static Boolean IsRunningOnBattery
{
   get
   {
      PowerLineStatus pls = System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus;
      if (pls == PowerLineStatus.Offline)
      {
         //Offline means running on battery
         return true;
      }
      else
      {
         return false;
      }
   }
}

您可以将其组合成一个:

public Boolean UseAnimations()
{
   return 
      (!System.Windows.Forms.SystemInformation.TerminalServerSession) &&
      (System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Offline);
}

注意:此问题已被提问(Determine if a program is running on a Remote Desktop

答案 2 :(得分:3)

除了进行初始检查以查看您的桌面是否在RDP会话中运行之外,您可能还希望处理在ap运行时连接或断开远程会话的情况。您可以在控制台会话上运行应用程序,然后有人可以启动与控制台的RDP连接。除非您的应用程序定期调用GetSystemMetrics,否则它将假定它不作为终端服务会话运行。

您可以让您的应用通过WTSRegisterSessionNotification注册会话更新通知。这将允许您的应用程序立即得到通知,即已打开或关闭运行您的应用程序的桌面会话的远程连接。有关示例C#代码,请参阅here

有关使用WTSRegisterSessionNotification的一些好的Delphi Win32 exampale代码,请参阅此page

答案 3 :(得分:2)

使用user32.dll中的GetSystemMetrics()功能。使用PInvoke进行调用。以下是第一个链接提供的示例代码。第二个链接告诉您如何在.NET中调用它。

 BOOL IsRemoteSession(void){
      return GetSystemMetrics( SM_REMOTESESSION );
   }

完整代码:

[DllImport("User32.dll")]
static extern Boolean IsRemoteSession()
{
 return GetSystemMetrics ( SM_REMOTESESSION);
}

还有SystemInformation.TerminalServerSession属性,用于确定客户端是否连接到终端服务器会话。 MSDN的code provided是广泛的,所以我不会在这里复制它。