RDP 세션에서 내 응용 프로그램이 실행 중인지 어떻게 알 수 있습니까?
문제
몇 가지 애니메이션 효과, 페이드 INS 및 스크롤 애니메이션 등의 .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;
}
}
}
하나로 결합 할 수 있습니다.
public Boolean UseAnimations()
{
return
(!System.Windows.Forms.SystemInformation.TerminalServerSession) &&
(System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Offline);
}
메모: 이 질문은 이미 묻습니다 (원격 데스크탑에서 프로그램이 실행 중인지 확인)
RDP 세션에서 데스크탑이 실행 중인지 확인하기 위해 초기 확인 외에도 AP가 실행중인 동안 원격 세션이 연결되거나 분리 된 상황을 처리 할 수도 있습니다. 콘솔 세션에서 앱을 실행 한 다음 누군가가 콘솔에 RDP 연결을 시작할 수 있습니다. 응용 프로그램이 주기적으로 GetSystemMetrics를 호출하지 않는 한, 터미널 서비스 세션으로 실행되지 않는다고 가정합니다.
WtsregistersessessionNotification을 통해 세션 업데이트 알림에 대한 앱 레지스터가 있습니다. 이를 통해 응용 프로그램이 실행중인 데스크탑 세션에 원격 연결이 열리거나 닫혀 있음을 즉시 알릴 수 있습니다. 보다 여기 일부 샘플 C# 코드의 경우.
WtsregistersSessionNotification을 사용하기위한 좋은 Delphi Win32 Exampale 코드의 경우이 참조를 참조하십시오. 페이지.
사용 getsystemmetrics () user32.dll에서 함수. 사용 핀 보크 그것을 부르기 위해. 다음은 첫 번째 링크에서 제공하는 샘플 코드입니다. 두 번째 링크는 .NET에서 호출하는 방법을 알려줍니다.
BOOL IsRemoteSession(void){
return GetSystemMetrics( SM_REMOTESESSION );
}
완전한 코드 :
[DllImport("User32.dll")]
static extern Boolean IsRemoteSession()
{
return GetSystemMetrics ( SM_REMOTESESSION);
}
또한 있습니다 SystemInformation.TerminalServerSession
클라이언트가 터미널 서버 세션에 연결되어 있는지 여부를 결정하는 속성. 그만큼 제공된 코드 MSDN은 광범위하기 때문에 여기서 복제하지 않습니다.