public void Open(DbItemRemoteLink linkSettings, DbItemSetting itemSetting, bool jump) { _itemRemoteLink = linkSettings; if (linkSettings.Password == null) { linkSettings.Password = ""; } Title = linkSettings.Name; Window mainWindow = Application.Current.MainWindow; Width = linkSettings.ExternalWindowWidth > MinWidth ? linkSettings.ExternalWindowWidth : mainWindow.Width; Height = linkSettings.ExternalWindowHeight > MinHeight ? linkSettings.ExternalWindowHeight : mainWindow.Height; try { Show(); FinalItemSetting finalItemSetting = null; if (linkSettings.Type == (int)RemoteType.rdp) { _remoteControl = new RemoteControl_rdp(this); finalItemSetting = new FinalItemSetting_rdp((DbItemSetting_rdp)itemSetting); } if (linkSettings.Type == (int)RemoteType.ssh) { _remoteControl = new RemoteControl_ssh(this); finalItemSetting = new FinalItemSetting_ssh((DbItemSetting_ssh)itemSetting); } if (linkSettings.Type == (int)RemoteType.telnet) { _remoteControl = new RemoteControl_telnet(this); finalItemSetting = new FinalItemSetting_telnet((DbItemSetting_telnet)itemSetting); } if (_remoteControl == null) { throw new Exception("可能是不支持的远程连接类型。"); } _remoteControl.Visibility = Visibility.Collapsed; Panel_Animation.Visibility = Visibility.Visible; Grid.Children.Add(_remoteControl); _remoteControl.OnConnected = _remoteControl_OnConnected; _remoteControl.OnFatalError = OnFatalError; _remoteControl.OnNonfatal = OnNonfatal; _remoteControl.Closed = Remove; _remoteControl.FullScreen = FullScreen; _remoteControl.Connect(linkSettings, finalItemSetting); _startFullScreen = finalItemSetting.FullScreen; } catch (Exception e) { OnFatalError("错误", $"远程桌面连接失败。\n原因:{e.Message}"); } }
public void Open(DbItemRemoteLink linkSettings, DbItemSetting itemSetting, bool jump) { _tabItem = MainWindow.AddTabItem(linkSettings.Name, this, jump); if (linkSettings.Password == null) { linkSettings.Password = ""; } _tabItem.Closed = _tabItem_Closed; try { FinalItemSetting finalItemSetting = null; if (linkSettings.Type == (int)RemoteType.rdp) { _remoteControl = new RemoteControl_rdp(this); finalItemSetting = new FinalItemSetting_rdp((DbItemSetting_rdp)itemSetting); } if (linkSettings.Type == (int)RemoteType.ssh) { _remoteControl = new RemoteControl_ssh(this); finalItemSetting = new FinalItemSetting_ssh((DbItemSetting_ssh)itemSetting); } if (linkSettings.Type == (int)RemoteType.telnet) { _remoteControl = new RemoteControl_telnet(this); finalItemSetting = new FinalItemSetting_telnet((DbItemSetting_telnet)itemSetting); } if (_remoteControl == null) { throw new Exception("可能是不支持的远程连接类型。"); } _remoteControl.Visibility = Visibility.Collapsed; Panel_Animation.Visibility = Visibility.Visible; Grid.Children.Add(_remoteControl); _remoteControl.OnConnected = _remoteControl_OnConnected; _remoteControl.OnFatalError = OnFatalError; _remoteControl.OnNonfatal = OnNonfatal; _remoteControl.Closed = Remove; _remoteControl.FullScreen = FullScreen; _remoteControl.Connect(linkSettings, finalItemSetting); _startFullScreen = finalItemSetting.FullScreen; } catch (Exception e) { OnFatalError("错误", $"远程桌面连接失败。\n原因:{e.Message}"); } }
public override void Connect(DbItemRemoteLink linkSettings, FinalItemSetting finalItemSetting) { string[] values = linkSettings.Server.Split(':'); if (values.Length > 2) { throw new Exception($"服务器地址不正确。"); //地址不正确 } string server = values[0]; string port = values.Length == 2 ? $"-P {values[1]}" : "-P 22"; FinalItemSetting_ssh finalSetting = (FinalItemSetting_ssh)finalItemSetting; IntPtr parentHwnd = FormsControl.Handle; Window windows = Window.GetWindow(this); int width = (int)windows.Width - 4; int height = (int)windows.Height - 34; Task.Run(() => { Putty.Settings settings = new Putty.Settings { fontname = finalSetting.FontName, fontsize = finalSetting.FontSize, curtype = finalSetting.Cursor - 1, linecodepage = Encoding.GetEncoding(finalSetting.Character).BodyName, backspaceisdelete = finalSetting.Fallbackkeys - 1, mouseisxterm = finalSetting.MouseAction - 1, puttycolor = new Putty.PuttyColor(finalSetting.GetPuttyColor()), rxvthomeend = finalSetting.HomeAndEnd - 1, functionkeys = finalSetting.FnAndKeypad - 1, cjkambigwide = finalSetting.CJKAmbigWide.Value, capslockcyr = finalSetting.CapsLockCyr.Value, crimplieslf = finalSetting.CRImpliesLF.Value, lfimpliescr = finalSetting.LFImpliesCR.Value, }; string user = string.IsNullOrEmpty(linkSettings.UserName) ? "" : $"-l {linkSettings.UserName}"; string pw = null; if (string.IsNullOrEmpty(linkSettings.PrivateKey)) { pw = string.IsNullOrEmpty(linkSettings.Password) ? "" : $"-pw {linkSettings.Password}"; } else { _privateKey = System.IO.Path.GetTempPath() + linkSettings.Id; using (StreamWriter streamWriter = new StreamWriter(_privateKey, false, Encoding.ASCII)) { streamWriter.Write(linkSettings.PrivateKey); streamWriter.Flush(); } pw = $"-i \"{_privateKey}\""; } if (!_putty.Create(parentHwnd, $"-ssh {port} {user} {pw} {server}", 0, 0, width, height, settings)) { string errorText = Marshal.PtrToStringAnsi(_putty.GetError()); Dispatcher.Invoke(() => { OnFatalError?.Invoke("错误", errorText); }); } _putty.Dispose(); _putty = null; if (_privateKey != null) { File.Delete(_privateKey); } GC.Collect(); GC.SuppressFinalize(this); }); }