diff --git a/mRemoteNG/App/ProgramRoot.cs b/mRemoteNG/App/ProgramRoot.cs index d04fddcba..3b4293e0a 100644 --- a/mRemoteNG/App/ProgramRoot.cs +++ b/mRemoteNG/App/ProgramRoot.cs @@ -14,6 +14,7 @@ namespace mRemoteNG.App public static class ProgramRoot { private static Mutex _mutex; + private static FrmSplashScreenNew _frmSplashScreen = null; /// /// The main entry point for the application. @@ -33,18 +34,19 @@ namespace mRemoteNG.App System.Windows.Forms.Application.EnableVisualStyles(); System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false); - var frmSplashScreen = FrmSplashScreenNew.GetInstance(); + _frmSplashScreen = FrmSplashScreenNew.GetInstance(); var targetScreen = Screen.PrimaryScreen; Rectangle viewport = targetScreen.WorkingArea; - frmSplashScreen.Top = viewport.Top; - frmSplashScreen.Left = viewport.Left; - // normaly it should be screens[1] however due DPI apply 1 size "same" as default with 100% - frmSplashScreen.Left = viewport.Left + (targetScreen.Bounds.Size.Width / 2) - (frmSplashScreen.Width / 2); - frmSplashScreen.Top = viewport.Top + (targetScreen.Bounds.Size.Height / 2) - (frmSplashScreen.Height / 2); - - frmSplashScreen.Show(); + _frmSplashScreen.Top = viewport.Top; + _frmSplashScreen.Left = viewport.Left; + // normally it should be screens[1] however due DPI apply 1 size "same" as default with 100% + _frmSplashScreen.Left = viewport.Left + (targetScreen.Bounds.Size.Width / 2) - (_frmSplashScreen.Width / 2); + _frmSplashScreen.Top = viewport.Top + (targetScreen.Bounds.Size.Height / 2) - (_frmSplashScreen.Height / 2); + _frmSplashScreen.ShowInTaskbar = false; + _frmSplashScreen.Show(); + throw new Exception(); System.Windows.Forms.Application.Run(FrmMain.Default); } @@ -101,14 +103,13 @@ namespace mRemoteNG.App private static void ApplicationOnThreadException(object sender, ThreadExceptionEventArgs e) { - // if (PresentationSource.FromVisual(FrmSplashScreenNew)) - FrmSplashScreenNew.GetInstance().Close(); + // if (PresentationSource.FromVisual(FrmSplashScreenNew)) + FrmSplashScreenNew.GetInstance().Close(); if (FrmMain.Default.IsDisposed) return; - + var window = new FrmUnhandledException(e.Exception, false); window.ShowDialog(FrmMain.Default); - } private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs e) diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs index 02341604b..ef7771984 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs @@ -261,7 +261,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml } else { - connectionInfo.Port = (int)RdpProtocol6.Defaults.Port; + connectionInfo.Port = (int)RdpProtocol.Defaults.Port; connectionInfo.Protocol = ProtocolType.RDP; } @@ -283,7 +283,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml if (xmlnode.GetAttributeAsBool("UseVNC")) connectionInfo.Port = (int)ProtocolVNC.Defaults.Port; else - connectionInfo.Port = (int)RdpProtocol6.Defaults.Port; + connectionInfo.Port = (int)RdpProtocol.Defaults.Port; } connectionInfo.UseConsoleSession = false; diff --git a/mRemoteNG/Connection/ConnectionInfo.cs b/mRemoteNG/Connection/ConnectionInfo.cs index 45a81708e..33bc5b9de 100644 --- a/mRemoteNG/Connection/ConnectionInfo.cs +++ b/mRemoteNG/Connection/ConnectionInfo.cs @@ -251,7 +251,7 @@ namespace mRemoteNG.Connection switch (protocol) { case ProtocolType.RDP: - return (int)RdpProtocol6.Defaults.Port; + return (int)RdpProtocol.Defaults.Port; case ProtocolType.VNC: return (int)ProtocolVNC.Defaults.Port; case ProtocolType.SSH1: diff --git a/mRemoteNG/Connection/ConnectionsService.cs b/mRemoteNG/Connection/ConnectionsService.cs index e4d92f90a..17dea44b6 100644 --- a/mRemoteNG/Connection/ConnectionsService.cs +++ b/mRemoteNG/Connection/ConnectionsService.cs @@ -12,7 +12,6 @@ using mRemoteNG.Config.Putty; using mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql; using mRemoteNG.Connection.Protocol; using mRemoteNG.Messages; -using mRemoteNG.Properties; using mRemoteNG.Security; using mRemoteNG.Tools; using mRemoteNG.Tree; @@ -75,8 +74,10 @@ namespace mRemoteNG.Connection { try { - var uriBuilder = new UriBuilder(); - uriBuilder.Scheme = "dummyscheme"; + var uriBuilder = new UriBuilder + { + Scheme = "dummyscheme" + }; if (connectionString.Contains("@")) { diff --git a/mRemoteNG/Connection/Protocol/IntegratedProgram.cs b/mRemoteNG/Connection/Protocol/IntegratedProgram.cs index 816ab72c9..3a291408d 100644 --- a/mRemoteNG/Connection/Protocol/IntegratedProgram.cs +++ b/mRemoteNG/Connection/Protocol/IntegratedProgram.cs @@ -134,7 +134,7 @@ namespace mRemoteNG.Connection.Protocol } } - public override void Resize(object sender, EventArgs e) + protected override void Resize(object sender, EventArgs e) { try { diff --git a/mRemoteNG/Connection/Protocol/PowerShell/Connection.Protocol.PowerShell.cs b/mRemoteNG/Connection/Protocol/PowerShell/Connection.Protocol.PowerShell.cs index 51d7dd137..7fec7b5de 100644 --- a/mRemoteNG/Connection/Protocol/PowerShell/Connection.Protocol.PowerShell.cs +++ b/mRemoteNG/Connection/Protocol/PowerShell/Connection.Protocol.PowerShell.cs @@ -71,7 +71,7 @@ namespace mRemoteNG.Connection.Protocol.PowerShell } } - public override void Resize(object sender, EventArgs e) + protected override void Resize(object sender, EventArgs e) { try { diff --git a/mRemoteNG/Connection/Protocol/ProtocolBase.cs b/mRemoteNG/Connection/Protocol/ProtocolBase.cs index 37ba0c97e..cf63bc0e3 100644 --- a/mRemoteNG/Connection/Protocol/ProtocolBase.cs +++ b/mRemoteNG/Connection/Protocol/ProtocolBase.cs @@ -5,7 +5,6 @@ using System.Threading; using System.Windows.Forms; using mRemoteNG.UI.Tabs; using System.Runtime.Versioning; -using mRemoteNG.UI.Forms; // ReSharper disable UnusedMember.Local @@ -63,7 +62,7 @@ namespace mRemoteNG.Connection.Protocol public ConnectionInfo.Force Force { get; set; } - public readonly System.Timers.Timer tmrReconnect = new System.Timers.Timer(5000); + protected readonly System.Timers.Timer tmrReconnect = new System.Timers.Timer(5000); protected ReconnectGroup ReconnectGroup; protected ProtocolBase(string name) @@ -93,15 +92,15 @@ namespace mRemoteNG.Connection.Protocol } } - public virtual void ResizeBegin(object sender, EventArgs e) + protected virtual void ResizeBegin(object sender, EventArgs e) { } - public virtual void Resize(object sender, EventArgs e) + protected virtual void Resize(object sender, EventArgs e) { } - public virtual void ResizeEnd(object sender, EventArgs e) + protected virtual void ResizeEnd(object sender, EventArgs e) { } @@ -222,6 +221,10 @@ namespace mRemoteNG.Connection.Protocol private void SetTagToNothing() { + if (!_interfaceControl.IsAccessible || _interfaceControl.IsDisposed || + !_interfaceControl.Parent.IsAccessible || _interfaceControl.Parent.IsDisposed) + { return; } + if (_interfaceControl.Parent.InvokeRequired) { var s = new SetTagToNothingCB(SetTagToNothing); @@ -238,10 +241,7 @@ namespace mRemoteNG.Connection.Protocol private void DisposeControl() { // do not attempt to dispose the control if the control is already closed, closing or disposed - if (Control == null || !Control.IsAccessible || Control.IsDisposed) - { - return; - } + if (Control == null || !Control.IsAccessible || Control.IsDisposed) { return; } if (Control.InvokeRequired) { diff --git a/mRemoteNG/Connection/Protocol/ProtocolFactory.cs b/mRemoteNG/Connection/Protocol/ProtocolFactory.cs index a103d5cd4..165bef1c7 100644 --- a/mRemoteNG/Connection/Protocol/ProtocolFactory.cs +++ b/mRemoteNG/Connection/Protocol/ProtocolFactory.cs @@ -7,7 +7,6 @@ using mRemoteNG.Connection.Protocol.Telnet; using mRemoteNG.Connection.Protocol.VNC; using System; using mRemoteNG.Connection.Protocol.PowerShell; -using mRemoteNG.Properties; using mRemoteNG.Resources.Language; using System.Runtime.Versioning; diff --git a/mRemoteNG/Connection/Protocol/PuttyBase.cs b/mRemoteNG/Connection/Protocol/PuttyBase.cs index 18efa712c..302243efe 100644 --- a/mRemoteNG/Connection/Protocol/PuttyBase.cs +++ b/mRemoteNG/Connection/Protocol/PuttyBase.cs @@ -265,7 +265,7 @@ namespace mRemoteNG.Connection.Protocol } } - public override void Resize(object sender, EventArgs e) + protected override void Resize(object sender, EventArgs e) { try { diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol6.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol.cs similarity index 92% rename from mRemoteNG/Connection/Protocol/RDP/RdpProtocol6.cs rename to mRemoteNG/Connection/Protocol/RDP/RdpProtocol.cs index 103f1cf84..90f8e0cfe 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol6.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol.cs @@ -18,7 +18,6 @@ using mRemoteNG.Resources.Language; using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; using System.DirectoryServices.ActiveDirectory; using System.Runtime.Versioning; -using System.IO; namespace mRemoteNG.Connection.Protocol.RDP { @@ -644,7 +643,7 @@ namespace mRemoteNG.Connection.Protocol.RDP { try { - SetDriveRedirection(); + _rdpClient.AdvancedSettings2.RedirectDrives = connectionInfo.RedirectDiskDrives; _rdpClient.AdvancedSettings2.RedirectPorts = connectionInfo.RedirectPorts; _rdpClient.AdvancedSettings2.RedirectPrinters = connectionInfo.RedirectPrinters; _rdpClient.AdvancedSettings2.RedirectSmartCards = connectionInfo.RedirectSmartCards; @@ -657,46 +656,6 @@ namespace mRemoteNG.Connection.Protocol.RDP } } - private void SetDriveRedirection() - { - if (RDPDiskDrives.None == connectionInfo.RedirectDiskDrives) - _rdpClient.AdvancedSettings2.RedirectDrives = false; - else if (RDPDiskDrives.All == connectionInfo.RedirectDiskDrives) - _rdpClient.AdvancedSettings2.RedirectDrives = true; - else if (RDPDiskDrives.Custom == connectionInfo.RedirectDiskDrives) - { - var rdpNS5 = (IMsRdpClientNonScriptable5)((AxHost)Control).GetOcx(); - for (uint i = 0; i < rdpNS5.DriveCollection.DriveCount; i++) - { - IMsRdpDrive drive = rdpNS5.DriveCollection.DriveByIndex[i]; - drive.RedirectionState = connectionInfo.RedirectDiskDrivesCustom.Contains(drive.Name.Substring(0, 1)); - } - } - else - { - // Local Drives - var rdpNS5 = (IMsRdpClientNonScriptable5)((AxHost)Control).GetOcx(); - for (uint i = 0; i < rdpNS5.DriveCollection.DriveCount; i++) - { - IMsRdpDrive drive = rdpNS5.DriveCollection.DriveByIndex[i]; - drive.RedirectionState = IsLocal(drive); - } - } - } - - private bool IsLocal(IMsRdpDrive drive) - { - DriveInfo[] myDrives = DriveInfo.GetDrives(); - foreach (DriveInfo myDrive in myDrives) - { - if (myDrive.Name.Substring(0, 1).Equals(drive.Name.Substring(0,1))) - { - return myDrive.DriveType == DriveType.Fixed; - } - } - return false; - } - private void SetPerformanceFlags() { try diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol10.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol10.cs index 611f1ad05..cd277b5c7 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol10.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol10.cs @@ -1,25 +1,27 @@ using System.Runtime.Versioning; using System.Windows.Forms; using AxMSTSCLib; -using MSTSCLib; namespace mRemoteNG.Connection.Protocol.RDP { [SupportedOSPlatform("windows")] public class RdpProtocol10 : RdpProtocol9 { - private MsRdpClient10NotSafeForScripting RdpClient10 => (MsRdpClient10NotSafeForScripting)((AxHost)Control).GetOcx(); - - protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc10; - + protected override RdpVersion RdpProtocolVersion => RDP.RdpVersion.Rdc10; + protected override AxHost CreateActiveXRdpClientControl() { - return new AxMsRdpClient10NotSafeForScripting(); + return new AxMsRdpClient11NotSafeForScripting(); } - protected override void UpdateSessionDisplaySettings(uint width, uint height) + public override bool Initialize() { - RdpClient10.UpdateSessionDisplaySettings(width, height, width, height, 0, 1, 1); + if (!base.Initialize()) + return false; + + if (RdpVersion < Versions.RDC100) return false; // minimum dll version checked, loaded MSTSCLIB dll version is not capable + + return true; } } diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol11.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol11.cs index 4db5465b1..769781a8a 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol11.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol11.cs @@ -1,25 +1,26 @@ using System.Runtime.Versioning; using System.Windows.Forms; using AxMSTSCLib; -using MSTSCLib; namespace mRemoteNG.Connection.Protocol.RDP { [SupportedOSPlatform("windows")] public class RdpProtocol11 : RdpProtocol10 { - private MsRdpClient11NotSafeForScripting RdpClient11 => (MsRdpClient11NotSafeForScripting)((AxHost)Control).GetOcx(); - - protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc11; + protected override RdpVersion RdpProtocolVersion => RDP.RdpVersion.Rdc11; protected override AxHost CreateActiveXRdpClientControl() { return new AxMsRdpClient11NotSafeForScripting(); } - - protected override void UpdateSessionDisplaySettings(uint width, uint height) + public override bool Initialize() { - RdpClient11.UpdateSessionDisplaySettings(width, height, width, height, 0, 1, 1); + if (!base.Initialize()) + return false; + + if (RdpVersion < Versions.RDC100) return false; // minimum dll version checked, loaded MSTSCLIB dll version is not capable + + return true; } } diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol7.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol7.cs index 42b60990d..9ff0ba0ba 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol7.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol7.cs @@ -9,9 +9,10 @@ using System.Runtime.Versioning; namespace mRemoteNG.Connection.Protocol.RDP { [SupportedOSPlatform("windows")] - public class RdpProtocol7 : RdpProtocol6 + public class RdpProtocol7 : RdpProtocol { - protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc7; + private MsRdpClient7NotSafeForScripting RdpClient7 => (MsRdpClient7NotSafeForScripting)((AxHost)Control).GetOcx(); + protected override RdpVersion RdpProtocolVersion => RDP.RdpVersion.Rdc7; public override bool Initialize() { @@ -20,20 +21,21 @@ namespace mRemoteNG.Connection.Protocol.RDP try { - var rdpClient7 = (MsRdpClient7NotSafeForScripting)((AxHost) Control).GetOcx(); - rdpClient7.AdvancedSettings8.AudioQualityMode = (uint)connectionInfo.SoundQuality; - rdpClient7.AdvancedSettings8.AudioCaptureRedirectionMode = connectionInfo.RedirectAudioCapture; - rdpClient7.AdvancedSettings8.NetworkConnectionType = (int)RdpNetworkConnectionType.Modem; + if (RdpVersion < Versions.RDC70) return false; // loaded MSTSCLIB dll version is not capable + + RdpClient7.AdvancedSettings8.AudioQualityMode = (uint)connectionInfo.SoundQuality; + RdpClient7.AdvancedSettings8.AudioCaptureRedirectionMode = connectionInfo.RedirectAudioCapture; + RdpClient7.AdvancedSettings8.NetworkConnectionType = (int)RdpNetworkConnectionType.Modem; if (connectionInfo.UseVmId) { SetExtendedProperty("DisableCredentialsDelegation", true); - rdpClient7.AdvancedSettings7.AuthenticationServiceClass = "Microsoft Virtual Console Service"; - rdpClient7.AdvancedSettings8.EnableCredSspSupport = true; - rdpClient7.AdvancedSettings8.NegotiateSecurityLayer = false; - rdpClient7.AdvancedSettings7.PCB = $"{connectionInfo.VmId}"; + RdpClient7.AdvancedSettings7.AuthenticationServiceClass = "Microsoft Virtual Console Service"; + RdpClient7.AdvancedSettings8.EnableCredSspSupport = true; + RdpClient7.AdvancedSettings8.NegotiateSecurityLayer = false; + RdpClient7.AdvancedSettings7.PCB = $"{connectionInfo.VmId}"; if (connectionInfo.UseEnhancedMode) - rdpClient7.AdvancedSettings7.PCB += ";EnhancedMode=1"; + RdpClient7.AdvancedSettings7.PCB += ";EnhancedMode=1"; } } catch (Exception ex) @@ -47,7 +49,8 @@ namespace mRemoteNG.Connection.Protocol.RDP protected override AxHost CreateActiveXRdpClientControl() { - return new AxMsRdpClient7NotSafeForScripting(); + return new AxMsRdpClient11NotSafeForScripting(); } + } } diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol8.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol8.cs index 6df68cedb..a635cb2ce 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol8.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol8.cs @@ -21,18 +21,28 @@ namespace mRemoteNG.Connection.Protocol.RDP public class RdpProtocol8 : RdpProtocol7 { private MsRdpClient8NotSafeForScripting RdpClient8 => (MsRdpClient8NotSafeForScripting)((AxHost)Control).GetOcx(); - private Size _controlBeginningSize; - protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc8; + protected override RdpVersion RdpProtocolVersion => RDP.RdpVersion.Rdc8; - public override bool SmartSize + public override bool Initialize() { - get => base.SmartSize; - protected set + if (!base.Initialize()) + return false; + + if (RdpVersion < Versions.RDC81) return false; // minimum dll version checked, loaded MSTSCLIB dll version is not capable + + // https://learn.microsoft.com/en-us/windows/win32/termserv/imsrdpextendedsettings-property + if (connectionInfo.UseRestrictedAdmin) { - base.SmartSize = value; - DoResizeClient(); + SetExtendedProperty("RestrictedLogon", true); } + else if (connectionInfo.UseRCG) + { + SetExtendedProperty("DisableCredentialsDelegation", true); + SetExtendedProperty("RedirectedAuthentication", true); + } + + return true; } public override bool Fullscreen @@ -45,28 +55,17 @@ namespace mRemoteNG.Connection.Protocol.RDP } } - public override void ResizeBegin(object sender, EventArgs e) + protected override void Resize(object sender, EventArgs e) { - _controlBeginningSize = Control.Size; + if (_frmMain.PreviousWindowState == _frmMain.WindowState) return; + DoResizeControl(); + DoResizeClient(); } - public override void Resize(object sender, EventArgs e) - { - if (DoResizeControl() && _controlBeginningSize.IsEmpty) - { - DoResizeClient(); - } - base.Resize(sender, e); - } - - public override void ResizeEnd(object sender, EventArgs e) + protected override void ResizeEnd(object sender, EventArgs e) { DoResizeControl(); - if (!(Control.Size == _controlBeginningSize)) - { - DoResizeClient(); - } - _controlBeginningSize = Size.Empty; + DoResizeClient(); } protected override AxHost CreateActiveXRdpClientControl() @@ -97,13 +96,13 @@ namespace mRemoteNG.Connection.Protocol.RDP var size = Fullscreen ? Screen.FromControl(Control).Bounds.Size : Control.Size; + UpdateSessionDisplaySettings((uint)size.Width, (uint)size.Height); } catch (Exception ex) { Runtime.MessageCollector.AddExceptionMessage( - string.Format(Language.ChangeConnectionResolutionError, - connectionInfo.Hostname), + string.Format(Language.ChangeConnectionResolutionError, connectionInfo.Hostname), ex, MessageClass.WarningMsg, false); } } @@ -112,20 +111,15 @@ namespace mRemoteNG.Connection.Protocol.RDP { Control.Location = InterfaceControl.Location; // kmscode - this doesn't look right to me. But I'm not aware of any functionality issues with this currently... - if (!(Control.Size == InterfaceControl.Size) && !(InterfaceControl.Size == Size.Empty)) - { - Control.Size = InterfaceControl.Size; - return true; - } - else - { - return false; - } + if (Control.Size == InterfaceControl.Size || InterfaceControl.Size == Size.Empty) return false; + Control.Size = InterfaceControl.Size; + return true; } protected virtual void UpdateSessionDisplaySettings(uint width, uint height) { RdpClient8.Reconnect(width, height); } + } } diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs index 391125c80..bf678d51a 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs @@ -11,7 +11,22 @@ namespace mRemoteNG.Connection.Protocol.RDP { private MsRdpClient9NotSafeForScripting RdpClient9 => (MsRdpClient9NotSafeForScripting)((AxHost)Control).GetOcx(); - protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc9; + protected override RdpVersion RdpProtocolVersion => RDP.RdpVersion.Rdc9; + + public RdpProtocol9() + { + _frmMain.ResizeEnd += ResizeEnd; + } + + public override bool Initialize() + { + if (!base.Initialize()) + return false; + + if (RdpVersion < Versions.RDC81) return false; // minimum dll version checked, loaded MSTSCLIB dll version is not capable + + return true; + } protected override AxHost CreateActiveXRdpClientControl() { @@ -20,7 +35,15 @@ namespace mRemoteNG.Connection.Protocol.RDP protected override void UpdateSessionDisplaySettings(uint width, uint height) { - RdpClient9.UpdateSessionDisplaySettings(width, height, width, height, 0, 1, 1); + try + { + RdpClient9.UpdateSessionDisplaySettings(width, height, width, height, Orientation, DesktopScaleFactor, DeviceScaleFactor); + } + catch (Exception) + { + // target OS does not support newer method, fallback to an older method + base.UpdateSessionDisplaySettings(width, height); + } } } diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocolFactory.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocolFactory.cs index d9a9ac45b..b9c3142a9 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocolFactory.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocolFactory.cs @@ -8,14 +8,14 @@ namespace mRemoteNG.Connection.Protocol.RDP [SupportedOSPlatform("windows")] public class RdpProtocolFactory { - public RdpProtocol6 Build(RdpVersion rdpVersion) + public RdpProtocol Build(RdpVersion rdpVersion) { switch (rdpVersion) { case RdpVersion.Highest: return BuildHighestSupportedVersion(); case RdpVersion.Rdc6: - return new RdpProtocol6(); + return new RdpProtocol(); case RdpVersion.Rdc7: return new RdpProtocol7(); case RdpVersion.Rdc8: @@ -31,7 +31,7 @@ namespace mRemoteNG.Connection.Protocol.RDP } } - private RdpProtocol6 BuildHighestSupportedVersion() + private RdpProtocol BuildHighestSupportedVersion() { var versions = Enum.GetValues(typeof(RdpVersion)) .OfType() diff --git a/mRemoteNG/Messages/MessageWriters/NotificationPanelMessageWriter.cs b/mRemoteNG/Messages/MessageWriters/NotificationPanelMessageWriter.cs index 4f51e8c1b..37773e722 100644 --- a/mRemoteNG/Messages/MessageWriters/NotificationPanelMessageWriter.cs +++ b/mRemoteNG/Messages/MessageWriters/NotificationPanelMessageWriter.cs @@ -27,6 +27,7 @@ namespace mRemoteNG.Messages.MessageWriters private void AddToList(ListViewItem lvItem) { + if (!_messageWindow.IsAccessible || _messageWindow.IsDisposed) { return; } if (_messageWindow.lvErrorCollector.InvokeRequired) _messageWindow.lvErrorCollector.Invoke((MethodInvoker)(() => AddToList(lvItem))); else diff --git a/mRemoteNG/Tools/Optional.cs b/mRemoteNG/Tools/Optional.cs index 2d0c83eb6..37080bb9f 100644 --- a/mRemoteNG/Tools/Optional.cs +++ b/mRemoteNG/Tools/Optional.cs @@ -19,7 +19,7 @@ namespace mRemoteNG.Tools /// public Optional() { - _optional = new T[0]; + _optional = Array.Empty(); } /// @@ -30,7 +30,7 @@ namespace mRemoteNG.Tools { _optional = value != null ? new[] {value} - : new T[0]; + : Array.Empty(); } public override string ToString() @@ -97,9 +97,7 @@ namespace mRemoteNG.Tools if (_optional[0] is IComparable) return ((IComparable)_optional[0]).CompareTo(other.First()); - throw new ArgumentException(string.Format( - "Cannot compare objects. Optional type {0} is not comparable to itself", - typeof(T).FullName)); + throw new ArgumentException($"Cannot compare objects. Optional type {typeof(T).FullName} is not comparable to itself"); } #endregion @@ -121,7 +119,7 @@ namespace mRemoteNG.Tools return false; } - public bool Equals(Optional other) + private bool Equals(Optional other) { var otherObj = other.FirstOrDefault(); var thisObj = _optional.FirstOrDefault(); diff --git a/mRemoteNG/Tools/ScanHost.cs b/mRemoteNG/Tools/ScanHost.cs index 00ee74ecb..6c77f0271 100644 --- a/mRemoteNG/Tools/ScanHost.cs +++ b/mRemoteNG/Tools/ScanHost.cs @@ -24,7 +24,7 @@ namespace mRemoteNG.Tools public static int HttpPort { get; set; } = (int)ProtocolHTTP.Defaults.Port; public static int HttpsPort { get; set; } = (int)ProtocolHTTPS.Defaults.Port; public static int RloginPort { get; set; } = (int)ProtocolRlogin.Defaults.Port; - public static int RdpPort { get; set; } = (int)RdpProtocol6.Defaults.Port; + public static int RdpPort { get; set; } = (int)RdpProtocol.Defaults.Port; public static int VncPort { get; set; } = (int)ProtocolVNC.Defaults.Port; public ArrayList OpenPorts { get; set; } public ArrayList ClosedPorts { get; set; } diff --git a/mRemoteNG/UI/Window/ConnectionWindow.cs b/mRemoteNG/UI/Window/ConnectionWindow.cs index 037e6b6b0..68ec2dfa4 100644 --- a/mRemoteNG/UI/Window/ConnectionWindow.cs +++ b/mRemoteNG/UI/Window/ConnectionWindow.cs @@ -375,7 +375,7 @@ namespace mRemoteNG.UI.Window if (interfaceControl.Info.Protocol == ProtocolType.RDP) { - var rdp = (RdpProtocol6)interfaceControl.Protocol; + var rdp = (RdpProtocol)interfaceControl.Protocol; cmenTabFullscreen.Visible = true; cmenTabFullscreen.Checked = rdp.Fullscreen; cmenTabSmartSize.Visible = true; @@ -433,7 +433,7 @@ namespace mRemoteNG.UI.Window switch (interfaceControl.Protocol) { - case RdpProtocol6 rdp: + case RdpProtocol rdp: rdp.ToggleSmartSize(); break; } @@ -562,7 +562,7 @@ namespace mRemoteNG.UI.Window try { var interfaceControl = GetInterfaceControl(); - var rdp = interfaceControl?.Protocol as RdpProtocol6; + var rdp = interfaceControl?.Protocol as RdpProtocol; rdp?.ToggleFullscreen(); } catch (Exception ex)