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 override void Loaded(DbItemRemoteLink itemRemoteLink) { var itemRdpSetting = DatabaseServices.GetRemoteSetting(itemRemoteLink) as DbItemSettingTelnet; if (itemRdpSetting != null) { _remoteName = itemRemoteLink.Name; DataContext = itemRdpSetting; ItemSetting = itemRdpSetting; itemRdpSetting.PropertyChanged += PropertyChanged; PART_Putty.Loaded(itemRemoteLink); } }
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 23"; FinalItemSetting_telnet finalSetting = (FinalItemSetting_telnet)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 = string.IsNullOrEmpty(linkSettings.Password) ? "" : $"-pw {linkSettings.Password}"; if (!_putty.Create(parentHwnd, $"-telnet {port} {user} {pw} {server}", 0, 0, width, height, settings)) { string errorText = Marshal.PtrToStringAnsi(_putty.GetError()); Dispatcher.Invoke(() => { OnFatalError?.Invoke("错误", errorText); }); } _putty.Dispose(); _putty = null; GC.Collect(); GC.SuppressFinalize(this); }); }
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}"); } }
/// <summary> /// 获取远程桌面的设置信息,包含分辨率和音频重定向等. /// </summary> public static DbItemSetting GetRemoteSetting(DbItemRemoteLink itemRemoteLink) { if (itemRemoteLink.Type == (int)RemoteType.rdp) { return(_tableSetting_rdp.FindById(itemRemoteLink.Id)); } if (itemRemoteLink.Type == (int)RemoteType.ssh) { return(_tableSetting_ssh.FindById(itemRemoteLink.Id)); } if (itemRemoteLink.Type == (int)RemoteType.telnet) { return(_tableSetting_telnet.FindById(itemRemoteLink.Id)); } return(null); }
public void Load(DbItemRemoteLink itemRemoteLink) { //清除ComboBox_SelectionChanged的事件,避免更改DataContext后立即引发事件 foreach (var item in Grid_ssh.GetChildObjects <ComboBox>()) { item.SelectionChanged -= ComboBox_SelectionChanged; } _itemSshSetting = (DbItemSetting_ssh)Database.GetRemoteSetting(itemRemoteLink); DataContext = _itemSshSetting; SSH_ComboBox_FontName.SelectedIndex = Array.FindIndex(GlobalSetting.EqualWidthFonts, m => m == _itemSshSetting.FontName) + 1; SSH_ComboBox_Character.SelectedIndex = Array.FindIndex(GlobalSetting.Encodings, m => m.CodePage == _itemSshSetting.Character) + 1; SSH_ComboBox_Color.SelectedIndex = Array.FindIndex(GlobalSetting.PuttyColorlNames, m => m == _itemSshSetting.ColorScheme) + 1; foreach (var item in Grid_ssh.GetChildObjects <ComboBox>()) { item.SelectionChanged += ComboBox_SelectionChanged; } }
/// <summary>打开远程桌面</summary> public static void OpenRemote(RemoteTreeViewItem treeTtem, int openMode) { IRemoteControl remoteControl = null; DbItemRemoteLink itemRemoteLink = Database.GetRemoteLink(treeTtem.uuid); if (string.IsNullOrEmpty(itemRemoteLink.Server)) { throw new Exception("服务器地址不能为空。"); } DbItemSetting itemSetting = Database.GetRemoteSetting(itemRemoteLink); if (openMode == DbItemSetting.OPEN_DEFAULT) { openMode = new FinalItemSetting(itemSetting).OpenMode; } //如果指定的远程桌面有在后台运行,则跳转 if (_remoteRunTime.ContainsKey(treeTtem.uuid)) { var value = _remoteRunTime[treeTtem.uuid]; if (value.OpenMode == openMode) { value.RemoteControl.Jump(); return; } value.RemoteControl.Remove(); _remoteRunTime.Remove(treeTtem.uuid); } //开始连接远程桌面 if (openMode == DbItemSetting.OPEN_WINDOW) { remoteControl = new RemoteWinControl(); } else { remoteControl = new RemoteTabControl(); } remoteControl.Open(itemRemoteLink, itemSetting, openMode == DbItemSetting.OPEN_TAB); _remoteRunTime.Add(treeTtem.uuid, new RemoteRunTime(openMode, remoteControl)); remoteControl.OnRemove += (sender, e) => _remoteRunTime.Remove(treeTtem.uuid); }
private void Home_Tree_EditHeaderClosing(object sender, CancelEditEventArgs e) { RemoteTreeViewItem treeItem = ((RemoteTreeViewItem)sender); if (treeItem == null) { return; } if (string.IsNullOrEmpty(e.NewValue)) { MainWindow.ShowMessageDialog("提示", "名称不能为空"); e.Cancel = true; return; } if (treeItem.RemoteType == RemoteType.dir) { DbItemDirectory itemDirectory = Database.GeyDirectory(treeItem.uuid); itemDirectory.Name = e.NewValue; Database.Update(itemDirectory.Id, itemDirectory); } else { if (_itemRemoteLink != null && _itemRemoteLink.Id == treeItem.uuid) { _itemRemoteLink.Name = e.NewValue; Database.Update(_itemRemoteLink.Id, _itemRemoteLink); TextBox_Name.Text = e.NewValue; } else { DbItemRemoteLink itemRemoteLink = Database.GetRemoteLink(treeItem.uuid); itemRemoteLink.Name = e.NewValue; Database.Update(itemRemoteLink.Id, itemRemoteLink); } } }
public static string Insert(DbItemRemoteLink itemRemoteLink, DbItemSetting itemSetting) { itemRemoteLink.Id = ObjectId.NewObjectId().ToString(); itemSetting.Id = itemRemoteLink.Id; if (itemRemoteLink.Type == (int)RemoteType.rdp) { _tableSetting_rdp.Insert((DbItemSettingRdp)itemSetting); } else if (itemRemoteLink.Type == (int)RemoteType.ssh) { _tableSetting_ssh.Insert((DbItemSettingSsh)itemSetting); } else if (itemRemoteLink.Type == (int)RemoteType.telnet) { _tableSetting_telnet.Insert((DbItemSettingTelnet)itemSetting); } else { return(null); } return(_tableRemoteLink.Insert(itemRemoteLink)); }
public override void Connect(DbItemRemoteLink linkSettings, DbItemSetting lastSetting) { DbItemSettingRdp lastSettingRdp = lastSetting as DbItemSettingRdp; if (lastSettingRdp == null) { return; } //分离服务器地址和端口 string[] addr = linkSettings.Server.Split(':'); int port = 3389; if (addr.Length > 1) { int.TryParse(addr[1], out port); } if (port <= 0) { port = 3389; } //初始化远程连接属性 if (MsRdpClient7 != null) //win7及以下版本 { MsRdpClient7.Server = addr[0]; MsRdpClient7.UserName = linkSettings.UserName; MsRdpClient7.AdvancedSettings2.ClearTextPassword = linkSettings.Password; MsRdpClient7.AdvancedSettings2.RDPPort = port; MsRdpClientOcx = (IMsRdpClientNonScriptable5)MsRdpClient7.GetOcx(); MsRdpClientOcx.PromptForCredentials = false; //凭据提示对话框 MsRdpClientOcx.AllowPromptingForCredentials = true; //显示密码输入框 MsRdpClientOcx.DisableConnectionBar = true; //禁用连接栏 //将窗口句柄设置或检索为控件显示的任何对话框的父窗口 var parentHwnd = CommonServices.HWNDtoRemotableHandle(new WindowInteropHelper(Window.GetWindow(this)).Handle); MsRdpClientOcx.set_UIParentWindowHandle(ref parentHwnd); MsRdpClient7.AdvancedSettings.BitmapPeristence = 1; //启用位图缓存 MsRdpClient7.AdvancedSettings.Compress = 1; //启用压缩 MsRdpClient7.AdvancedSettings.ContainerHandledFullScreen = 1; //启用容器处理的全屏模式。 MsRdpClient7.AdvancedSettings2.BitmapPersistence = 1; //持久位图缓存 MsRdpClient7.AdvancedSettings2.CachePersistenceActive = 1; //持久位图缓存 MsRdpClient7.AdvancedSettings2.GrabFocusOnConnect = false; //连接的时候获取焦点 MsRdpClient7.AdvancedSettings7.EnableCredSspSupport = true; //指定是否为此连接启用凭据安全服务提供程序 //分辨率 if (lastSettingRdp.SizeIndex == DbItemSetting.DESKSIZE_AUTO)//自适应分辨率 { Window windows = Window.GetWindow(this); MsRdpClient7.DesktopWidth = (int)windows.Width - 4; MsRdpClient7.DesktopHeight = (int)windows.Height - 34; } else { var size = lastSettingRdp.GetDeskTopSize(); MsRdpClient7.DesktopWidth = (int)size.Width; MsRdpClient7.DesktopHeight = (int)size.Height; } //性能选项 if (lastSettingRdp.Performance != DbItemSettingRdp.CONNECTION_TYPE_AUTO) { MsRdpClient7.AdvancedSettings8.NetworkConnectionType = (uint)lastSettingRdp.Performance; } //颜色深度 switch (lastSettingRdp.ColorDepthMode) { case DbItemSettingRdp.COLOR_15BPP: MsRdpClient7.ColorDepth = 15; break; case DbItemSettingRdp.COLOR_16BPP: MsRdpClient7.ColorDepth = 16; break; case DbItemSettingRdp.COLOR_24BPP: MsRdpClient7.ColorDepth = 24; break; case DbItemSettingRdp.COLOR_32BPP: MsRdpClient7.ColorDepth = 32; break; default: MsRdpClient7.ColorDepth = 32; break; } //音频 MsRdpClient7.AdvancedSettings6.AudioRedirectionMode = (uint)lastSettingRdp.AudioRedirectionMode - 1; //组合键 MsRdpClient7.SecuredSettings2.KeyboardHookMode = lastSettingRdp.KeyboardHookMode - 1; //本地资源 MsRdpClient7.AdvancedSettings2.RedirectPrinters = lastSettingRdp.RedirectionPrintf.Value ? true : false; //打印机 MsRdpClient7.AdvancedSettings6.RedirectClipboard = lastSettingRdp.RedirectionClipboard.Value ? true : false; //剪贴板重定向 MsRdpClient7.AdvancedSettings3.RedirectSmartCards = lastSettingRdp.RedirectionsMartcard.Value ? true : false; //智能卡重定向 MsRdpClient7.AdvancedSettings3.RedirectPorts = lastSettingRdp.RedirectionsPort.Value ? true : false; //端口重定向 MsRdpClient7.AdvancedSettings3.RedirectDrives = lastSettingRdp.RedirectionsDriver.Value ? true : false; //驱动器重定向 MsRdpClient7.AdvancedSettings4.ConnectionBarShowMinimizeButton = false;//显示全部工具栏上的最小化按钮 MsRdpClient7.AdvancedSettings7.ConnectToAdministerServer = false; MsRdpClient7.Connect(); User32.EnumChildWindows(MsRdpClient7.Handle, EnumWindowsProc, IntPtr.Zero); } else //win8 及以上版本 { MsRdpClient9.Server = addr[0]; MsRdpClient9.UserName = linkSettings.UserName; MsRdpClient9.AdvancedSettings2.ClearTextPassword = linkSettings.Password; MsRdpClient9.AdvancedSettings2.RDPPort = port; MsRdpClientOcx = (IMsRdpClientNonScriptable5)MsRdpClient9.GetOcx(); MsRdpClientOcx.PromptForCredentials = false; //凭据提示对话框 MsRdpClientOcx.AllowPromptingForCredentials = true; //显示密码输入框 MsRdpClientOcx.DisableConnectionBar = true; //禁用连接栏 //将窗口句柄设置或检索为控件显示的任何对话框的父窗口 var parentHwnd = CommonServices.HWNDtoRemotableHandle(new WindowInteropHelper(Window.GetWindow(this)).Handle); MsRdpClientOcx.set_UIParentWindowHandle(ref parentHwnd); MsRdpClient9.AdvancedSettings.BitmapPeristence = 1; //启用位图缓存 MsRdpClient9.AdvancedSettings.Compress = 1; //启用压缩 MsRdpClient9.AdvancedSettings.ContainerHandledFullScreen = 1; //启用容器处理的全屏模式。 MsRdpClient9.AdvancedSettings2.BitmapPersistence = 1; //持久位图缓存 MsRdpClient9.AdvancedSettings2.CachePersistenceActive = 1; //持久位图缓存 MsRdpClient9.AdvancedSettings2.GrabFocusOnConnect = false; //连接的时候获取焦点 MsRdpClient9.AdvancedSettings7.EnableCredSspSupport = true; //指定是否为此连接启用凭据安全服务提供程序 //分辨率 if (lastSettingRdp.SizeIndex == DbItemSetting.DESKSIZE_AUTO)//自适应分辨率 { Window windows = Window.GetWindow(this); MsRdpClient9.DesktopWidth = (int)windows.Width - 4; MsRdpClient9.DesktopHeight = (int)windows.Height - 34; } else { var size = lastSettingRdp.GetDeskTopSize(); MsRdpClient9.DesktopWidth = (int)size.Width; MsRdpClient9.DesktopHeight = (int)size.Height; } //性能选项 if (lastSettingRdp.Performance == DbItemSettingRdp.CONNECTION_TYPE_AUTO) { MsRdpClient9.AdvancedSettings9.BandwidthDetection = true; //自动检查带宽 } else { MsRdpClient9.AdvancedSettings8.NetworkConnectionType = (uint)lastSettingRdp.Performance; } //颜色深度 switch (lastSettingRdp.ColorDepthMode) { case DbItemSettingRdp.COLOR_15BPP: MsRdpClient9.ColorDepth = 15; break; case DbItemSettingRdp.COLOR_16BPP: MsRdpClient9.ColorDepth = 16; break; case DbItemSettingRdp.COLOR_24BPP: MsRdpClient9.ColorDepth = 24; break; case DbItemSettingRdp.COLOR_32BPP: MsRdpClient9.ColorDepth = 32; break; default: MsRdpClient9.ColorDepth = 32; break; } //音频 MsRdpClient9.AdvancedSettings6.AudioRedirectionMode = (uint)lastSettingRdp.AudioRedirectionMode - 1; //录音设备 MsRdpClient9.AdvancedSettings8.AudioCaptureRedirectionMode = lastSettingRdp.AudioCaptureRedirectionMode == DbItemSettingRdp.AAUDIOCAPTURE_TRUE; //组合键 MsRdpClient9.SecuredSettings2.KeyboardHookMode = lastSettingRdp.KeyboardHookMode - 1; //重定向 MsRdpClient9.AdvancedSettings2.RedirectPrinters = lastSettingRdp.RedirectionPrintf.Value ? true : false; //打印机 MsRdpClient9.AdvancedSettings6.RedirectClipboard = lastSettingRdp.RedirectionClipboard.Value ? true : false; //剪贴板重定向 MsRdpClient9.AdvancedSettings3.RedirectSmartCards = lastSettingRdp.RedirectionsMartcard.Value ? true : false; //智能卡重定向 MsRdpClient9.AdvancedSettings3.RedirectPorts = lastSettingRdp.RedirectionsPort.Value ? true : false; //端口重定向 MsRdpClient9.AdvancedSettings3.RedirectDrives = lastSettingRdp.RedirectionsDriver.Value ? true : false; //驱动器重定向 MsRdpClient9.AdvancedSettings4.ConnectionBarShowMinimizeButton = false; //显示全部工具栏上的最小化按钮 MsRdpClient9.Connect(); User32.EnumChildWindows(MsRdpClient9.Handle, EnumWindowsProc, IntPtr.Zero); } }
/// <summary> /// 更新指定的条目连接信息. /// </summary> public static bool Update(string id, DbItemRemoteLink document) { return(_tableRemoteLink.Update(id, document)); }
public void Load(DbItemRemoteLink itemRemoteLink) { _itemRdpSetting = (DbItemSetting_rdp)Database.GetRemoteSetting(itemRemoteLink); DataContext = _itemRdpSetting; }
public new virtual void Loaded(DbItemRemoteLink itemRemoteLink) { }
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e) { if (e.NewValue != null) { if (_itemRemoteLink != null) { Database.Update(_itemRemoteLink.Id, _itemRemoteLink); } RemoteTreeViewItem selectItem = (RemoteTreeViewItem)e.NewValue; if (selectItem.RemoteType != RemoteType.dir) { ScrollViewer.Visibility = Visibility.Visible; _itemRemoteLink = Database.GetRemoteLink(selectItem.uuid); ScrollViewer.DataContext = _itemRemoteLink; TextBox_Password.Password = _itemRemoteLink.Password; TextBox_Name.Text = _itemRemoteLink.Name; switch (selectItem.RemoteType) { case RemoteType.rdp: Expander_Setting.Content = _home_Remote_rdp; _home_Remote_rdp.Load(_itemRemoteLink); Grid_PrivateKey.Visibility = Visibility.Collapsed; break; case RemoteType.ssh: //加载私钥 if (_itemRemoteLink.PrivateKey == null) { CheckBox_PrivateKey.IsChecked = false; } else { CheckBox_PrivateKey.IsChecked = true; } CheckBox_PrivateKey_Click(null, null); Expander_Setting.Content = _home_Remote_ssh; _home_Remote_ssh.Load(_itemRemoteLink); Grid_PrivateKey.Visibility = Visibility.Visible; break; case RemoteType.telnet: Expander_Setting.Content = _home_Remote_telnet; _home_Remote_telnet.Load(_itemRemoteLink); TextBox_Password.IsEnabled = true; Grid_PrivateKey.Visibility = Visibility.Collapsed; break; default: Expander_Setting.Content = null; break; } } else { ScrollViewer.Visibility = Visibility.Collapsed; } } }
public override void Loaded(DbItemRemoteLink itemRemoteLink) { PART_Utility.Loaded(itemRemoteLink); }
public override void Connect(DbItemRemoteLink linkSettings, DbItemSetting lastSetting) { DbItemSettingSsh lastSettingSsh = lastSetting as DbItemSettingSsh; if (lastSettingSsh == null) { return; } 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"; IntPtr parentHwnd = FormsControl.Handle; Window windows = Window.GetWindow(this); int width = (int)windows.Width - 4; int height = (int)windows.Height - 34; Thread thread = new Thread(() => { Putty.Settings settings = new Putty.Settings { fontname = lastSettingSsh.FontName, fontsize = lastSettingSsh.FontSize, curtype = lastSettingSsh.Cursor - 1, linecodepage = Encoding.GetEncoding(lastSettingSsh.Character).BodyName, backspaceisdelete = lastSettingSsh.Fallbackkeys - 1, mouseisxterm = lastSettingSsh.MouseAction - 1, puttycolor = new Putty.PuttyColor(lastSettingSsh.GetPuttyColor()), rxvthomeend = lastSettingSsh.HomeAndEnd - 1, functionkeys = lastSettingSsh.FnAndKeypad - 1, cjkambigwide = lastSettingSsh.CJKAmbigWide.Value, capslockcyr = lastSettingSsh.CapsLockCyr.Value, crimplieslf = lastSettingSsh.CRImpliesLF.Value, lfimpliescr = lastSettingSsh.LFImpliesCR.Value, }; string user = string.IsNullOrEmpty(linkSettings.UserName) ? "" : $"-l {linkSettings.UserName}"; string pw = null; if (string.IsNullOrWhiteSpace(linkSettings.PrivateKey)) { pw = string.IsNullOrEmpty(linkSettings.Password) ? "" : $"-pw {linkSettings.Password}"; } else { _privateKey = 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); }); thread.Start(); }