いくつかのアニメーション効果、フェードイン、スクロールアニメーションなどを備えた.net winformsアプリがあります。これらは正常に機能しますが、リモートデスクトッププロトコルセッションを使用している場合は、アニメーションがすり減り始めます。
この場合、効果をオフにできるように、アプリがRDPセッション全体で実行されているかどうかを判断する方法を誰かが提案できますか?
少なくとも .NET Framework 2.0 を使用していると仮定すると、P/Invoke を使用する必要はありません。 System.Windows.Forms.SystemInformation.TerminalServerSession
( MSDN ) の値を確認するだけです。
私が尋ねた同様の質問を参照してください:バッテリーで動作しているかどうかを確認する方法は?
バッテリーで実行している場合は、アニメーションも無効にする必要があるためです。
/// <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;
}
}
}
1つに組み合わせることができます:
public Boolean UseAnimations()
{
return
(!System.Windows.Forms.SystemInformation.TerminalServerSession) &&
(System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Offline);
}
注:この質問は既に行われています (プログラムがリモート デスクトップで実行されているかどうかを確認する) 。
デスクトップが RDP セッションで実行されているかどうかを確認するための初期チェックに加えて、ap の実行中にリモート セッションが接続または切断された状況を処理することもできます。コンソール セッションでアプリを実行すると、誰かがコンソールへの RDP 接続を開始できます。アプリケーションが定期的に GetSystemMetrics を呼び出していない限り、ターミナル サービス セッションとして実行されていないと見なされます。
WTSRegisterSessionNotification を介してセッション更新通知にアプリを登録します。これにより、アプリケーションが実行されているデスクトップ セッションへのリモート接続が開かれたか閉じられたことが、アプリケーションにすぐに通知されます。サンプル C# コードについては、こちらを参照してください。
WTSRegisterSessionNotification を使用するための優れた Delphi Win32 サンプル コードについては、このページを参照してください。
user32.dllのGetSystemMetrics()関数を使用します。PInvokeを使用して呼び出します。以下は、最初のリンクによって提供されるサンプルコードです。2番目のリンクは、.NETで呼び出す方法を示しています。
BOOL IsRemoteSession(void){
return GetSystemMetrics( SM_REMOTESESSION );
}
完全なコード:
[DllImport("User32.dll")]
static extern Boolean IsRemoteSession()
{
return GetSystemMetrics ( SM_REMOTESESSION);
}
SystemInformation.TerminalServerSession
クライアントがターミナルサーバーセッションに接続されているかどうかを決定するプロパティもあります。MSDNが提供するコードは広範囲にわたるため、ここでは複製しません。