我有一个.net winforms应用程序,它有一些动画效果,淡入和滚动动画等。但这些工作正常,但如果我在远程桌面协议会话中动画开始感激。
有人可以建议一种方法来确定某个应用是否在RDP会话中运行,这样我可以在这种情况下关闭效果吗?
答案 0 :(得分:20)
假设您至少使用的是.NET Framework 2.0,则无需使用P / Invoke:只需检查System.Windows.Forms.SystemInformation.TerminalServerSession
(MSDN)的值即可。
答案 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是广泛的,所以我不会在这里复制它。