skipped 8 lines 9 9 using System.Threading.Tasks; 10 10 using NETworkManager.Utilities; 11 11 12 - namespace NETworkManager.Controls 12 + namespace NETworkManager.Controls; 13 + 14 + public partial class RemoteDesktopControl : INotifyPropertyChanged 13 15 { 14 - public partial class RemoteDesktopControl : INotifyPropertyChanged 16 + #region PropertyChangedEventHandler 17 + public event PropertyChangedEventHandler PropertyChanged; 18 + 19 + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 15 20 { 16 - #region PropertyChangedEventHandler 17 - public event PropertyChangedEventHandler PropertyChanged; 21 + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 22 + } 23 + #endregion 18 24 19 - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 20 - { 21 - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 22 - } 23 - #endregion 24 - 25 - #region Variables 26 - private bool _initialized; 25 + #region Variables 26 + private bool _initialized; 27 27 28 - private readonly RemoteDesktopSessionInfo _rdpSessionInfo; 28 + private readonly RemoteDesktopSessionInfo _rdpSessionInfo; 29 29 30 - // Fix WindowsFormsHost width31 - private double _rdpClientWidth;32 - public double RdpClientWidth 30 + // Fix WindowsFormsHost width 31 + private double _rdpClientWidth; 32 + public double RdpClientWidth 33 + { 34 + get => _rdpClientWidth; 35 + set 33 36 { 34 - get => _rdpClientWidth; 35 - set 36 - { 37 - if (value == _rdpClientWidth) 38 - return; 37 + if ( value == _rdpClientWidth) 38 + return; 39 39 40 - _rdpClientWidth = value; 41 - OnPropertyChanged(); 42 - } 40 + _rdpClientWidth = value; 41 + OnPropertyChanged(); 43 42 } 43 + } 44 44 45 - // Fix WindowsFormsHost height46 - private double _rdpClientHeight;47 - public double RdpClientHeight 45 + // Fix WindowsFormsHost height 46 + private double _rdpClientHeight; 47 + public double RdpClientHeight 48 + { 49 + get => _rdpClientHeight; 50 + set 48 51 { 49 - get => _rdpClientHeight; 50 - set 51 - { 52 - if (value == _rdpClientHeight) 53 - return; 52 + if ( value == _rdpClientHeight) 53 + return; 54 54 55 - _rdpClientHeight = value; 56 - OnPropertyChanged(); 57 - } 55 + _rdpClientHeight = value; 56 + OnPropertyChanged(); 58 57 } 58 + } 59 59 60 - private bool _isConnected;61 - public bool IsConnected 60 + private bool _isConnected; 61 + public bool IsConnected 62 + { 63 + get => _isConnected; 64 + set 62 65 { 63 - get => _isConnected; 64 - set 65 - { 66 - if (value == _isConnected) 67 - return; 66 + if ( value == _isConnected) 67 + return; 68 68 69 - _isConnected = value; 70 - OnPropertyChanged(); 71 - } 69 + _isConnected = value; 70 + OnPropertyChanged(); 72 71 } 72 + } 73 73 74 - private bool _isConnecting;75 - public bool IsConnecting 74 + private bool _isConnecting; 75 + public bool IsConnecting 76 + { 77 + get => _isConnecting; 78 + set 76 79 { 77 - get => _isConnecting; 78 - set 79 - { 80 - if (value == _isConnecting) 81 - return; 80 + if ( value == _isConnecting) 81 + return; 82 82 83 - _isConnecting = value; 84 - OnPropertyChanged(); 85 - } 83 + _isConnecting = value; 84 + OnPropertyChanged(); 86 85 } 86 + } 87 87 88 - private string _disconnectReason;89 - public string DisconnectReason 88 + private string _disconnectReason; 89 + public string DisconnectReason 90 + { 91 + get => _disconnectReason; 92 + set 90 93 { 91 - get => _disconnectReason; 92 - set 93 - { 94 - if (value == _disconnectReason) 95 - return; 94 + if ( value == _disconnectReason) 95 + return; 96 96 97 - _disconnectReason = value; 98 - OnPropertyChanged(); 99 - } 97 + _disconnectReason = value; 98 + OnPropertyChanged(); 100 99 } 100 + } 101 101 102 - private bool _isReconnecting;103 - public bool IsReconnecting 102 + private bool _isReconnecting; 103 + public bool IsReconnecting 104 + { 105 + get => _isReconnecting; 106 + set 104 107 { 105 - get => _isReconnecting; 106 - set 107 - { 108 - if (value == _isReconnecting) 109 - return; 108 + if ( value == _isReconnecting) 109 + return; 110 110 111 - _isReconnecting = value; 112 - OnPropertyChanged(); 113 - } 111 + _isReconnecting = value; 112 + OnPropertyChanged(); 114 113 } 115 - #endregion 114 + } 115 + #endregion 116 + 117 + #region Constructor, load 118 + public RemoteDesktopControl(RemoteDesktopSessionInfo info) 119 + { 120 + InitializeComponent(); 121 + DataContext = this; 122 + 123 + _rdpSessionInfo = info; 124 + 125 + Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; 126 + } 116 127 117 - #region Constructor, load 118 - public RemoteDesktopControl(RemoteDesktopSessionInfo info) 119 - { 120 - InitializeComponent(); 121 - DataContext = this; 128 + private void UserControl_Loaded(object sender, RoutedEventArgs e) 129 + { 130 + // Connect after the control is drawn and only on the first init 131 + if (_initialized) 132 + return; 122 133 123 - _rdpSessionInfo = info; 134 + Connect(); 135 + _initialized = true; 136 + } 137 + 138 + private void Dispatcher_ShutdownStarted(object sender, EventArgs e) 139 + { 140 + CloseTab(); 141 + } 142 + #endregion 124 143 125 - Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted; 126 - } 144 + #region ICommands & Actions 145 + public ICommand ReconnectCommand 146 + { 147 + get { return new RelayCommand(p => ReconnectAction()); } 148 + } 127 149 128 - private void UserControl_Loaded(object sender, RoutedEventArgs e) 129 - {130 - // Connect after the control is drawn and only on the first init 131 - if (_initialized) 132 - return; 150 + private void ReconnectAction() 151 + { 152 + Reconnect(); 153 + } 133 154 134 - Connect(); 135 - _initialized = true; 136 - } 155 + public ICommand DisconnectCommand 156 + { 157 + get { return new RelayCommand(p => DisconnectAction()); } 158 + } 137 159 138 - private void Dispatcher_ShutdownStarted(object sender, EventArgs e) 139 - {140 - CloseTab(); 141 - }142 - #endregion 160 + private void DisconnectAction() 161 + { 162 + Disconnect(); 163 + } 164 + #endregion 143 165 144 - #region ICommands & Actions 145 - public ICommand ReconnectCommand 146 - {147 - get { return new RelayCommand(p => ReconnectAction()); } 148 - } 166 + #region Methods 167 + private void Connect() 168 + { 169 + IsConnecting = true; 149 170 150 - private void ReconnectAction() 151 - { 152 - Reconnect(); 153 - } 171 + RdpClient.CreateControl(); 154 172 155 - public ICommand DisconnectCommand 156 - { 157 - get { return new RelayCommand(p => DisconnectAction()); } 158 - } 173 + RdpClient.Server = _rdpSessionInfo.Hostname; 174 + RdpClient.AdvancedSettings9.RDPPort = _rdpSessionInfo.Port; 159 175 160 - private void DisconnectAction() 176 + if (_rdpSessionInfo.CustomCredentials) 161 177 { 162 - Disconnect(); 178 + RdpClient.UserName = _rdpSessionInfo.Username; 179 + RdpClient.AdvancedSettings9.ClearTextPassword = SecureStringHelper.ConvertToString(_rdpSessionInfo.Password); 163 180 } 164 - #endregion 165 181 166 - #region Methods 167 - private void Connect() 168 - { 169 - IsConnecting = true; 182 + // AdvancedSettings 183 + RdpClient.AdvancedSettings9.AuthenticationLevel = _rdpSessionInfo.AuthenticationLevel; 184 + RdpClient.AdvancedSettings9.EnableCredSspSupport = _rdpSessionInfo.EnableCredSspSupport; 170 185 171 - RdpClient.CreateControl(); 186 + // Keyboard 187 + RdpClient.SecuredSettings3.KeyboardHookMode = (int)_rdpSessionInfo.KeyboardHookMode; 172 188 173 - RdpClient.Server = _rdpSessionInfo.Hostname; 174 - RdpClient.AdvancedSettings9.RDPPort = _rdpSessionInfo.Port ; 189 + // Devices and resources 190 + RdpClient.AdvancedSettings9.RedirectClipboard = _rdpSessionInfo.RedirectClipboard ; 191 + RdpClient.AdvancedSettings9.RedirectDevices = _rdpSessionInfo.RedirectDevices; 192 + RdpClient.AdvancedSettings9.RedirectDrives = _rdpSessionInfo.RedirectDrives; 193 + RdpClient.AdvancedSettings9.RedirectPorts = _rdpSessionInfo.RedirectPorts; 194 + RdpClient.AdvancedSettings9.RedirectSmartCards = _rdpSessionInfo.RedirectSmartCards; 195 + RdpClient.AdvancedSettings9.RedirectPrinters = _rdpSessionInfo.RedirectPrinters; 175 196 176 - if (_rdpSessionInfo.CustomCredentials) 177 - { 178 - RdpClient.UserName = _rdpSessionInfo.Username; 179 - RdpClient.AdvancedSettings9.ClearTextPassword = SecureStringHelper.ConvertToString(_rdpSessionInfo.Password); 180 - } 197 + // Audio 198 + RdpClient.AdvancedSettings9.AudioRedirectionMode = (uint)_rdpSessionInfo.AudioRedirectionMode; 199 + RdpClient.AdvancedSettings9.AudioCaptureRedirectionMode = _rdpSessionInfo.AudioCaptureRedirectionMode == 0; 181 200 182 - // AdvancedSettings 183 - RdpClient.AdvancedSettings9.AuthenticationLevel = _rdpSessionInfo.AuthenticationLevel ; 184 - RdpClient.AdvancedSettings9.EnableCredSspSupport = _rdpSessionInfo.EnableCredSspSupport ; 201 + // Performance 202 + RdpClient.AdvancedSettings9.BitmapPeristence = _rdpSessionInfo.PersistentBitmapCaching ? 1 : 0 ; 203 + RdpClient.AdvancedSettings9.EnableAutoReconnect = _rdpSessionInfo.ReconnectIfTheConnectionIsDropped ; 185 204 186 - // Keyboard 187 - RdpClient.SecuredSettings3.KeyboardHookMode = (int)_rdpSessionInfo.KeyboardHookMode; 205 + // Experience 206 + if (_rdpSessionInfo.NetworkConnectionType != 0) 207 + { 208 + RdpClient.AdvancedSettings9.NetworkConnectionType = (uint)_rdpSessionInfo.NetworkConnectionType; 188 209 189 - // Devices and resources 190 - RdpClient.AdvancedSettings9.RedirectClipboard = _rdpSessionInfo.RedirectClipboard; 191 - RdpClient.AdvancedSettings9.RedirectDevices = _rdpSessionInfo.RedirectDevices; 192 - RdpClient.AdvancedSettings9.RedirectDrives = _rdpSessionInfo.RedirectDrives; 193 - RdpClient.AdvancedSettings9.RedirectPorts = _rdpSessionInfo.RedirectPorts; 194 - RdpClient.AdvancedSettings9.RedirectSmartCards = _rdpSessionInfo.RedirectSmartCards; 195 - RdpClient.AdvancedSettings9.RedirectPrinters = _rdpSessionInfo.RedirectPrinters; 210 + if (!_rdpSessionInfo.DesktopBackground) 211 + RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_DISABLE_WALLPAPER; 196 212 197 - // Audio 198 - RdpClient.AdvancedSettings9.AudioRedirectionMode = (uint)_rdpSessionInfo.AudioRedirectionMode; 199 - RdpClient.AdvancedSettings9.AudioCaptureRedirectionMode = _rdpSessionInfo.AudioCaptureRedirectionMode == 0; 213 + if (_rdpSessionInfo.FontSmoothing) 214 + RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_ENABLE_FONT_SMOOTHING; 200 215 201 - // Performance 202 - RdpClient.AdvancedSettings9.BitmapPeristence = _rdpSessionInfo.PersistentBitmapCaching ? 1 : 0; 203 - RdpClient.AdvancedSettings9.EnableAutoReconnect = _rdpSessionInfo.ReconnectIfTheConnectionIsDropped; 216 + if (_rdpSessionInfo.DesktopComposition) 217 + RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_ENABLE_DESKTOP_COMPOSITION; 204 218 205 - // Experience 206 - if (_rdpSessionInfo.NetworkConnectionType != 0) 207 - { 208 - RdpClient.AdvancedSettings9.NetworkConnectionType = (uint)_rdpSessionInfo.NetworkConnectionType; 219 + if (!_rdpSessionInfo.ShowWindowContentsWhileDragging) 220 + RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_DISABLE_FULLWINDOWDRAG; 209 221 210 - if (!_rdpSessionInfo.DesktopBackground ) 211 - RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_DISABLE_WALLPAPER ; 222 + if (!_rdpSessionInfo.MenuAndWindowAnimation ) 223 + RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_DISABLE_MENUANIMATIONS ; 212 224 213 - if (_rdpSessionInfo.FontSmoothing ) 214 - RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_ENABLE_FONT_SMOOTHING ; 225 + if (! _rdpSessionInfo.VisualStyles ) 226 + RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_DISABLE_THEMING ; 227 + } 215 228 216 - if (_rdpSessionInfo.DesktopComposition) 217 - RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_ENABLE_DESKTOP_COMPOSITION; 229 + // Display 230 + RdpClient.ColorDepth = _rdpSessionInfo.ColorDepth; // 8, 15, 16, 24 218 231 219 - if (!_rdpSessionInfo.ShowWindowContentsWhileDragging) 220 - RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_DISABLE_FULLWINDOWDRAG; 232 + if (_rdpSessionInfo.AdjustScreenAutomatically || _rdpSessionInfo.UseCurrentViewSize) 233 + { 234 + RdpClient.DesktopWidth = (int)RdpGrid.ActualWidth; 235 + RdpClient.DesktopHeight = (int)RdpGrid.ActualHeight; 236 + } 237 + else 238 + { 239 + RdpClient.DesktopWidth = _rdpSessionInfo.DesktopWidth; 240 + RdpClient.DesktopHeight = _rdpSessionInfo.DesktopHeight; 241 + } 221 242 222 - if (!_rdpSessionInfo.MenuAndWindowAnimation) 223 - RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_DISABLE_MENUANIMATIONS; 243 + FixWindowsFormsHostSize(); 224 244 225 - if (!_rdpSessionInfo.VisualStyles) 226 - RdpClient.AdvancedSettings9.PerformanceFlags |= RemoteDesktopPerformanceConstants.TS_PERF_DISABLE_THEMING; 227 - } 245 + // Events 246 + RdpClient.OnConnected += RdpClient_OnConnected; 247 + RdpClient.OnDisconnected += RdpClient_OnDisconnected; 228 248 229 - // Display 230 - RdpClient.ColorDepth = _rdpSessionInfo.ColorDepth; // 8, 15, 16, 24 249 + RdpClient.AdvancedSettings9.EnableWindowsKey = 1; // Enable window key 250 + RdpClient.AdvancedSettings9.allowBackgroundInput = 1; // Background input to send keystrokes like ctrl+alt+del 231 251 232 - if (_rdpSessionInfo.AdjustScreenAutomatically || _rdpSessionInfo.UseCurrentViewSize) 233 - { 234 - RdpClient.DesktopWidth = (int)RdpGrid.ActualWidth; 235 - RdpClient.DesktopHeight = (int)RdpGrid.ActualHeight; 236 - } 237 - else 238 - { 239 - RdpClient.DesktopWidth = _rdpSessionInfo.DesktopWidth; 240 - RdpClient.DesktopHeight = _rdpSessionInfo.DesktopHeight; 241 - } 252 + RdpClient.Connect(); 253 + } 242 254 243 - FixWindowsFormsHostSize(); 255 + private void Reconnect() 256 + { 257 + if (IsConnected) 258 + return; 244 259 245 - // Events 246 - RdpClient.OnConnected += RdpClient_OnConnected; 247 - RdpClient.OnDisconnected += RdpClient_OnDisconnected; 260 + IsConnecting = true; 248 261 249 - RdpClient.AdvancedSettings9.EnableWindowsKey = 1; // Enable window key 250 - RdpClient.AdvancedSettings9.allowBackgroundInput = 1; // Background input to send keystrokes like ctrl+alt+del 251 - 252 - RdpClient.Connect(); 262 + if (_rdpSessionInfo.AdjustScreenAutomatically) 263 + { 264 + RdpClient.DesktopWidth = (int)RdpGrid.ActualWidth; 265 + RdpClient.DesktopHeight = (int)RdpGrid.ActualHeight; 253 266 } 254 267 255 - private void Reconnect() 256 - { 257 - if (IsConnected) 258 - return; 268 + FixWindowsFormsHostSize(); 259 269 260 - IsConnecting = true; 270 + RdpClient.Connect(); 271 + } 261 272 262 - if (_rdpSessionInfo.AdjustScreenAutomatically) 263 - {264 - RdpClient.DesktopWidth = (int)RdpGrid.ActualWidth; 265 - RdpClient.DesktopHeight = (int)RdpGrid.ActualHeight; 266 - } 273 + public void FullScreen() 274 + { 275 + if (!IsConnected) 276 + return; 267 277 268 - FixWindowsFormsHostSize(); 278 + RdpClient.FullScreen = true; 279 + } 269 280 270 - RdpClient.Connect(); 271 - } 281 + public void AdjustScreen() 282 + { 283 + if (!IsConnected) 284 + return; 272 285 273 - public void FullScreen() 274 - { 275 - if (!IsConnected) 276 - return; 286 + RdpClient.Reconnect((uint)RdpGrid.ActualWidth, (uint)RdpGrid.ActualHeight); 277 287 278 - RdpClient.FullScreen = true; 279 - } 288 + FixWindowsFormsHostSize(); 289 + } 280 290 281 - public void AdjustScreen() 282 - {283 - if (!IsConnected) 284 - return; 291 + private void FixWindowsFormsHostSize() 292 + { 293 + RdpClientWidth = RdpClient.DesktopWidth; 294 + RdpClientHeight = RdpClient.DesktopHeight; 295 + } 285 296 286 - RdpClient.Reconnect((uint)RdpGrid.ActualWidth, (uint)RdpGrid.ActualHeight); 297 + public void SendKey(Keystroke keystroke) 298 + { 299 + if (!IsConnected) 300 + return; 287 301 288 - FixWindowsFormsHostSize(); 289 - } 302 + MSTSCLib.IMsRdpClientNonScriptable ocx = (MSTSCLib.IMsRdpClientNonScriptable)RdpClient.GetOcx(); 290 303 291 - private void FixWindowsFormsHostSize() 292 - { 293 - RdpClientWidth = RdpClient.DesktopWidth; 294 - RdpClientHeight = RdpClient.DesktopHeight; 295 - } 304 + var info = RemoteDesktop.GetKeystroke(keystroke); 296 305 297 - public void SendKey(Keystroke keystroke) 298 - { 299 - if (!IsConnected) 300 - return; 306 + RdpClient.Focus(); 301 307 302 - MSTSCLib.IMsRdpClientNonScriptable ocx = (MSTSCLib.IMsRdpClientNonScriptable)RdpClient.GetOcx(); 308 + ocx.SendKeys(info.KeyData.Length, info.ArrayKeyUp, info.KeyData); 309 + } 303 310 304 - var info = RemoteDesktop.GetKeystroke(keystroke); 305 - 306 - RdpClient.Focus(); 307 - 308 - ocx.SendKeys(info.KeyData.Length, info.ArrayKeyUp, info.KeyData); 309 - } 311 + private void Disconnect() 312 + { 313 + if (!IsConnected) 314 + return; 310 315 311 - private void Disconnect() 312 - { 313 - if (!IsConnected) 314 - return; 316 + RdpClient . Disconnect(); 317 + } 315 318 316 - RdpClient.Disconnect(); 317 - } 319 + public void CloseTab() 320 + { 321 + Disconnect(); 322 + } 318 323 319 - public void CloseTab() 324 + private static string GetDisconnectReason(int reason) 325 + { 326 + switch (reason) 320 327 { 321 - Disconnect(); 328 + case 0: 329 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_NoInfo; 330 + case 1: 331 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_LocalNotError; 332 + case 2: 333 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_RemoteByUser; 334 + case 3: 335 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_ByServer; 336 + case 4: 337 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_TotalLoginTimeLimitReached; 338 + case 260: 339 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_DNSLookupFailed; 340 + case 262: 341 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_OutOfMemory; 342 + case 264: 343 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_ConnectionTimedOut; 344 + case 516: 345 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SocketConnectFailed; 346 + case 518: 347 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_OutOfMemory2; 348 + case 520: 349 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_HostNotFound; 350 + case 772: 351 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_WinsockSendFailed; 352 + case 774: 353 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_OutOfMemory3; 354 + case 776: 355 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidIPAddr; 356 + case 1028: 357 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SocketRecvFailed; 358 + case 1030: 359 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidSecurityData; 360 + case 1032: 361 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InternalError; 362 + case 1286: 363 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidEncryption; 364 + case 1288: 365 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_DNSLookupFailed2; 366 + case 1540: 367 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_GetHostByNameFailed; 368 + case 1542: 369 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidServerSecurityInfo; 370 + case 1544: 371 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_TimerError; 372 + case 1796: 373 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_TimeoutOccurred; 374 + case 1798: 375 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_ServerCertificateUnpackErr; 376 + case 2052: 377 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidIP; 378 + case 2055: 379 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrLogonFailure; 380 + case 2056: 381 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_LicensingFailed; 382 + case 2308: 383 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE; 384 + case 2310: 385 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InternalSecurityError; 386 + case 2312: 387 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_LicensingTimeout; 388 + case 2566: 389 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InternalSecurityError2; 390 + case 2567: 391 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrNoSuchUser; 392 + case 2822: 393 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_EncryptionError; 394 + case 2823: 395 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrAccountDisabled; 396 + case 3078: 397 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_DecryptionError; 398 + case 3079: 399 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrAccountRestriction; 400 + case 3080: 401 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_ClientDecompressionError; 402 + case 3335: 403 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrAccountLockedOut; 404 + case 3591: 405 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrAccountExpired; 406 + case 3847: 407 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrPasswordExpired; 408 + case 4360: 409 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_UnableToReconnectToRemoteSession; 410 + case 4615: 411 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrPasswordMustChange; 412 + case 5639: 413 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrDelegationPolicy; 414 + case 5895: 415 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly; 416 + case 6151: 417 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthority; 418 + case 6919: 419 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrCertExpired; 420 + case 7175: 421 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN; 422 + case 8455: 423 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServer; 424 + case 8711: 425 + return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked; 426 + default: 427 + return "Disconnect reason code " + reason + " not found in resources!" + Environment.NewLine + "(You can report this on GitHub)"; 322 428 } 429 + } 430 + #endregion 323 431 324 - private static string GetDisconnectReason(int reason) 325 - { 326 - switch (reason) 327 - { 328 - case 0: 329 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_NoInfo; 330 - case 1: 331 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_LocalNotError; 332 - case 2: 333 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_RemoteByUser; 334 - case 3: 335 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_ByServer; 336 - case 4: 337 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_TotalLoginTimeLimitReached; 338 - case 260: 339 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_DNSLookupFailed; 340 - case 262: 341 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_OutOfMemory; 342 - case 264: 343 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_ConnectionTimedOut; 344 - case 516: 345 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SocketConnectFailed; 346 - case 518: 347 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_OutOfMemory2; 348 - case 520: 349 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_HostNotFound; 350 - case 772: 351 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_WinsockSendFailed; 352 - case 774: 353 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_OutOfMemory3; 354 - case 776: 355 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidIPAddr; 356 - case 1028: 357 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SocketRecvFailed; 358 - case 1030: 359 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidSecurityData; 360 - case 1032: 361 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InternalError; 362 - case 1286: 363 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidEncryption; 364 - case 1288: 365 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_DNSLookupFailed2; 366 - case 1540: 367 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_GetHostByNameFailed; 368 - case 1542: 369 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidServerSecurityInfo; 370 - case 1544: 371 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_TimerError; 372 - case 1796: 373 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_TimeoutOccurred; 374 - case 1798: 375 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_ServerCertificateUnpackErr; 376 - case 2052: 377 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InvalidIP; 378 - case 2055: 379 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrLogonFailure; 380 - case 2056: 381 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_LicensingFailed; 382 - case 2308: 383 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE; 384 - case 2310: 385 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InternalSecurityError; 386 - case 2312: 387 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_LicensingTimeout; 388 - case 2566: 389 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_InternalSecurityError2; 390 - case 2567: 391 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrNoSuchUser; 392 - case 2822: 393 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_EncryptionError; 394 - case 2823: 395 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrAccountDisabled; 396 - case 3078: 397 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_DecryptionError; 398 - case 3079: 399 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrAccountRestriction; 400 - case 3080: 401 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_ClientDecompressionError; 402 - case 3335: 403 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrAccountLockedOut; 404 - case 3591: 405 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrAccountExpired; 406 - case 3847: 407 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrPasswordExpired; 408 - case 4360: 409 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_UnableToReconnectToRemoteSession; 410 - case 4615: 411 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrPasswordMustChange; 412 - case 5639: 413 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrDelegationPolicy; 414 - case 5895: 415 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly; 416 - case 6151: 417 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthority; 418 - case 6919: 419 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrCertExpired; 420 - case 7175: 421 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN; 422 - case 8455: 423 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServer; 424 - case 8711: 425 - return Localization.Resources.Strings.RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked; 426 - default: 427 - return "Disconnect reason code " + reason + " not found in resources!" + Environment.NewLine + "(You can report this on GitHub)"; 428 - } 429 - } 430 - #endregion 432 + #region Events 433 + private void RdpClient_OnConnected(object sender, EventArgs e) 434 + { 435 + IsConnected = true; 436 + IsConnecting = false; 437 + } 431 438 432 - #region Events 433 - private void RdpClient_OnConnected(object sender, EventArgs e) 434 - { 435 - IsConnected = true; 436 - IsConnecting = false; 437 - } 439 + private void RdpClient_OnDisconnected(object sender, AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEvent e) 440 + { 441 + IsConnected = false; 442 + IsConnecting = false; 438 443 439 - private void RdpClient_OnDisconnected(object sender, AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEvent e) 440 - { 441 - IsConnected = false; 442 - IsConnecting = false; 444 + DisconnectReason = GetDisconnectReason(e.discReason); 445 + } 443 446 444 - DisconnectReason = GetDisconnectReason(e.discReason); 445 - } 447 + private void RdpGrid_SizeChanged(object sender, SizeChangedEventArgs e) 448 + { 449 + if (IsConnected && _rdpSessionInfo.AdjustScreenAutomatically && !IsReconnecting) 450 + InitiateReconnection(); 451 + } 446 452 447 - private void RdpGrid_SizeChanged(object sender, SizeChangedEventArgs e) 448 - {449 - if (IsConnected && _rdpSessionInfo.AdjustScreenAutomatically && !IsReconnecting) 450 - InitiateReconnection(); 451 - } 453 + private async Task InitiateReconnection() 454 + { 455 + IsReconnecting = true; 452 456 453 - private async Task InitiateReconnection() 457 + do // Prevent to many requests 454 458 { 455 - IsReconnecting = true; 456 - 457 - do // Prevent to many requests 458 - { 459 - await Task.Delay(250); 459 + await Task.Delay(250); 460 460 461 - } while (Mouse.LeftButton == MouseButtonState.Pressed); 461 + } while (Mouse.LeftButton == MouseButtonState.Pressed); 462 462 463 - AdjustScreen(); 463 + AdjustScreen(); 464 464 465 - IsReconnecting = false; 466 - } 467 - #endregion 465 + IsReconnecting = false; 468 466 } 467 + #endregion 469 468 }