Ответ 1
Предполагая, что вы, по крайней мере, на .NET Framework 2.0, нет необходимости использовать P/Invoke: просто проверьте значение System.Windows.Forms.SystemInformation.TerminalServerSession
(MSDN).
У меня есть приложение .net winforms, которое имеет несколько эффектов анимации, fade ins и анимацию прокрутки и т.д. Это прекрасно работает, если я нахожусь в сеансе протокола удаленного рабочего стола, анимации начинают колотить.
Может кто-нибудь предложить способ определить, работает ли приложение в 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, вы также можете обрабатывать ситуацию, когда удаленный сеанс подключен или отключен во время работы вашего приложения. У вас может быть приложение, запущенное на сеансе консоли, а затем кто-то может инициировать подключение RDP к консоли. Если ваше приложение периодически делает вызов GetSystemMetrics, оно предполагает, что оно не работает как сеанс служб терминалов.
У вас будет ваш регистр приложений для уведомлений об обновлении сеанса через WTSRegisterSessionNotification. Это позволит немедленно уведомлять ваше приложение о том, что удаленное соединение было открыто или закрыто для сеанса рабочего стола, на котором работает ваше приложение. См. здесь для примера кода С#.
Для какого-то хорошего кода проверки Delphi Win32 для использования WTSRegisterSessionNotification см. эту страницу.
Используйте GetSystemMetrics() в user32.dll. Используйте PInvoke, чтобы позвонить ему. Ниже приведен пример кода, предоставленного первой ссылкой. Вторая ссылка сообщает вам, как ее вызывать в .NET.
BOOL IsRemoteSession(void){
return GetSystemMetrics( SM_REMOTESESSION );
}
Полный код:
[DllImport("User32.dll")]
static extern Boolean IsRemoteSession()
{
return GetSystemMetrics ( SM_REMOTESESSION);
}
Также существует свойство SystemInformation.TerminalServerSession
, которое определяет, подключен ли клиент к сеансу сервера терминалов. код, предоставленный в MSDN, обширен, поэтому я не буду дублировать его здесь.