From 2fb0ab1d91639a0ca483430d60db02869cad8eae Mon Sep 17 00:00:00 2001 From: Daniel Triendl Date: Fri, 18 Mar 2022 19:17:46 +0100 Subject: [PATCH] Enable size change without reconnect Use IMsRdpClient9::UpdateSessionDisplaySettings to dynamically update the session display settings without reconnecting. RDP Version needs to be Rdc9 or Highest for this to work. Fixes #1546 --- .../Connection/Protocol/RDP/RdpProtocol8.cs | 25 +++++++----- .../Connection/Protocol/RDP/RdpProtocol9.cs | 39 ++++++++++++------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol8.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol8.cs index c1cb1057..d3bf69f4 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol8.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol8.cs @@ -29,7 +29,7 @@ namespace mRemoteNG.Connection.Protocol.RDP protected set { base.SmartSize = value; - ReconnectForResize(); + DoResizeClient(); } } @@ -39,7 +39,7 @@ namespace mRemoteNG.Connection.Protocol.RDP protected set { base.Fullscreen = value; - ReconnectForResize(); + DoResizeClient(); } } @@ -50,19 +50,19 @@ namespace mRemoteNG.Connection.Protocol.RDP public override void Resize(object sender, EventArgs e) { - if (DoResize() && _controlBeginningSize.IsEmpty) + if (DoResizeControl() && _controlBeginningSize.IsEmpty) { - ReconnectForResize(); + DoResizeClient(); } base.Resize(sender, e); } public override void ResizeEnd(object sender, EventArgs e) { - DoResize(); + DoResizeControl(); if (!(Control.Size == _controlBeginningSize)) { - ReconnectForResize(); + DoResizeClient(); } _controlBeginningSize = Size.Empty; } @@ -72,7 +72,7 @@ namespace mRemoteNG.Connection.Protocol.RDP return new AxMsRdpClient8NotSafeForScripting(); } - private void ReconnectForResize() + private void DoResizeClient() { if (!loginComplete) return; @@ -94,8 +94,8 @@ namespace mRemoteNG.Connection.Protocol.RDP { var size = Fullscreen ? Screen.FromControl(Control).Bounds.Size - : Control.Size; - RdpClient8.Reconnect((uint)size.Width, (uint)size.Height); + : Control.Size; + UpdateSessionDisplaySettings((uint)size.Width, (uint)size.Height); } catch (Exception ex) { @@ -106,7 +106,7 @@ namespace mRemoteNG.Connection.Protocol.RDP } } - private bool DoResize() + private bool DoResizeControl() { Control.Location = InterfaceControl.Location; // kmscode - this doesn't look right to me. But I'm not aware of any functionality issues with this currently... @@ -120,5 +120,10 @@ namespace mRemoteNG.Connection.Protocol.RDP return false; } } + + 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 64923285..e0527d8b 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs @@ -1,15 +1,24 @@ -using System.Windows.Forms; -using AxMSTSCLib; - -namespace mRemoteNG.Connection.Protocol.RDP -{ - public class RdpProtocol9 : RdpProtocol8 - { - protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc9; - - protected override AxHost CreateActiveXRdpClientControl() - { - return new AxMsRdpClient9NotSafeForScripting(); - } - } -} +using System.Windows.Forms; +using AxMSTSCLib; +using MSTSCLib; + +namespace mRemoteNG.Connection.Protocol.RDP +{ + public class RdpProtocol9 : RdpProtocol8 + { + private MsRdpClient9NotSafeForScripting RdpClient9 => + (MsRdpClient9NotSafeForScripting)((AxHost)Control).GetOcx(); + + protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc9; + + protected override AxHost CreateActiveXRdpClientControl() + { + return new AxMsRdpClient9NotSafeForScripting(); + } + + protected override void UpdateSessionDisplaySettings(uint width, uint height) + { + RdpClient9.UpdateSessionDisplaySettings(width, height, width, height, 0, 1, 1); + } + } +} \ No newline at end of file