From 0d4f193dc159845144dc5670702f2ff1febe5850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BC=A0=E8=A5=BF=E5=A5=A5?= Date: Thu, 28 Jun 2018 16:01:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=94=AE=E7=9B=98=E6=98=A0?= =?UTF-8?q?=E5=B0=84=20=E9=BC=A0=E6=A0=87=E4=B8=AD=E9=94=AE=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E9=A1=B5=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 + RdpTest/MainForm.Designer.cs | 28 +++++---- RdpTest/MainForm.cs | 114 +++++++++++++++++++++++++++-------- RdpTest/RemoteHostForm.cs | 4 +- 4 files changed, 109 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 8a3315b..e89c0bd 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ MSTSC 还有一种说法,Microsoft Telnet Screen Control ,即“微软远程 * 右击页面头会有菜单选项,比如可执行 `关闭` 操作,右击连接方块可进行 `编辑`、`删除` 等操作 * 切换主题,偶尔换换口味吧 * 编辑时可以点击右上角的 `复制` 则保留该连接信息,点保存时换创建一个新的连接 +* 鼠标中键关闭页签 (远程桌面) +* 键盘映射,当窗口处于活动状态远程桌面将获得键盘事件,当窗口不处于活动状态则本机获得键盘事件,建议点击远程窗口和本机任务栏来进行键盘映射的切换 以上功能均是出于我个人使用习惯,可能对您并不实用,所以文档也含糊一下啦,抱歉! diff --git a/RdpTest/MainForm.Designer.cs b/RdpTest/MainForm.Designer.cs index b2c16df..0119d6e 100644 --- a/RdpTest/MainForm.Designer.cs +++ b/RdpTest/MainForm.Designer.cs @@ -33,6 +33,7 @@ private void InitializeComponent() this.pageMain = new System.Windows.Forms.TabPage(); this.panelBody = new System.Windows.Forms.Panel(); this.pnlSetting = new MetroFramework.Controls.MetroPanel(); + this.btnAbout = new MetroFramework.Controls.MetroLink(); this.btnAddRemoteHost = new MetroFramework.Controls.MetroLink(); this.btnRefresh = new MetroFramework.Controls.MetroLink(); this.btnChangeStyle = new MetroFramework.Controls.MetroTile(); @@ -44,7 +45,6 @@ private void InitializeComponent() this.menuTabPage = new System.Windows.Forms.ContextMenuStrip(this.components); this.tmiCloseHost = new System.Windows.Forms.ToolStripMenuItem(); this.metroStyleManager = new MetroFramework.Components.MetroStyleManager(this.components); - this.btnAbout = new MetroFramework.Controls.MetroLink(); this.tabMain.SuspendLayout(); this.pageMain.SuspendLayout(); this.pnlSetting.SuspendLayout(); @@ -107,6 +107,18 @@ private void InitializeComponent() this.pnlSetting.VerticalScrollbarHighlightOnWheel = false; this.pnlSetting.VerticalScrollbarSize = 10; // + // btnAbout + // + this.btnAbout.Dock = System.Windows.Forms.DockStyle.Left; + this.btnAbout.Location = new System.Drawing.Point(268, 0); + this.btnAbout.Name = "btnAbout"; + this.btnAbout.Size = new System.Drawing.Size(67, 37); + this.btnAbout.TabIndex = 5; + this.btnAbout.Text = "关于"; + this.btnAbout.UseSelectable = true; + this.btnAbout.UseVisualStyleBackColor = true; + this.btnAbout.Click += new System.EventHandler(this.btnAbout_Click); + // // btnAddRemoteHost // this.btnAddRemoteHost.Dock = System.Windows.Forms.DockStyle.Left; @@ -202,18 +214,6 @@ private void InitializeComponent() // this.metroStyleManager.Owner = this; // - // btnAbout - // - this.btnAbout.Dock = System.Windows.Forms.DockStyle.Left; - this.btnAbout.Location = new System.Drawing.Point(268, 0); - this.btnAbout.Name = "btnAbout"; - this.btnAbout.Size = new System.Drawing.Size(67, 37); - this.btnAbout.TabIndex = 5; - this.btnAbout.Text = "关于"; - this.btnAbout.UseSelectable = true; - this.btnAbout.UseVisualStyleBackColor = true; - this.btnAbout.Click += new System.EventHandler(this.btnAbout_Click); - // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); @@ -225,6 +225,8 @@ private void InitializeComponent() this.Style = MetroFramework.MetroColorStyle.Default; this.Text = "远程桌面管理"; this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Activated += new System.EventHandler(this.MainForm_Activated); + this.Deactivate += new System.EventHandler(this.MainForm_Deactivate); this.Load += new System.EventHandler(this.MainForm_Load); this.MouseLeave += new System.EventHandler(this.MainForm_MouseLeave); this.tabMain.ResumeLayout(false); diff --git a/RdpTest/MainForm.cs b/RdpTest/MainForm.cs index 4e974cd..16fdfef 100644 --- a/RdpTest/MainForm.cs +++ b/RdpTest/MainForm.cs @@ -31,10 +31,13 @@ public MainForm() private void MainForm_Load(object sender, EventArgs e) { //异步加载远程桌面配置 - BeginInvoke(new Action(LoadHostConfig)); + BeginInvoke(new Action(LoadHosts)); } - private void LoadHostConfig() + /// + /// 加载所以远程桌面配置 + /// + private void LoadHosts() { panelBody.Visible = false; panelBody.Controls.Clear(); //清空原有 @@ -73,7 +76,10 @@ private void LoadHostConfig() panelBody.Visible = true; } - void ConnectRemoteHost(object sender, EventArgs e) + /// + /// 连接远程桌面 + /// + private void ConnectRemoteHost(object sender, EventArgs e) { var host = (RemoteHost)((MetroTile)sender).Tag; @@ -100,8 +106,12 @@ void ConnectRemoteHost(object sender, EventArgs e) rdpClient.UserName = host.User; rdpClient.AdvancedSettings2.ClearTextPassword = host.Pwd; - //进运行远程程序模式 - if (!string.IsNullOrEmpty(host.RemoteProgram)) + if (string.IsNullOrEmpty(host.RemoteProgram)) //普通远程桌面模式 + { + //映射键盘 + rdpClient.SecuredSettings3.KeyboardHookMode = 1; + } + else //运行远程程序模式 { rdpClient.RemoteProgram2.RemoteProgramMode = true; rdpClient.Width = Screen.PrimaryScreen.Bounds.Width; @@ -122,13 +132,6 @@ void ConnectRemoteHost(object sender, EventArgs e) }; } - //rdpClient.RemoteProgram2.RemoteProgramMode = true; - //rdpClient.OnLoginComplete += (o, args) => - //{ - // rdpClient.RemoteProgram2.ServerStartProgram("cmd", "", "%SYSTEMROOT%", false, "", false); - // tabMain.TabPages.Remove(page); - //}; - /* 因为分辨率比例问题,缩放效果并不怎么样 rdpClient.Width = Screen.PrimaryScreen.Bounds.Width; rdpClient.Height = Screen.PrimaryScreen.Bounds.Height; @@ -146,7 +149,17 @@ void ConnectRemoteHost(object sender, EventArgs e) rdpClient.Connect(); } + private AxMsRdpClient9NotSafeForScripting GetHost(int pageIndex) + { + var page = tabMain.TabPages[pageIndex]; + return (AxMsRdpClient9NotSafeForScripting)page.Controls[0]; + } + + #region 菜单按钮 + /// + /// 切换主题 + /// private void btnChangeStyle_Click(object sender, EventArgs e) { var nextStyle = ((int)metroStyleManager.Style + 1) % 14; @@ -159,25 +172,34 @@ private void btnChangeStyle_Click(object sender, EventArgs e) Refresh(); } + /// + /// 刷新 + /// private void btnRefresh_Click(object sender, EventArgs e) { - LoadHostConfig(); + LoadHosts(); } + /// + /// 添加主机 + /// private void btnAddRemoteHost_Click(object sender, EventArgs e) { var hostForm = new RemoteHostForm { StyleManager = metroStyleManager }; if (hostForm.ShowDialog() == DialogResult.OK) - LoadHostConfig(); + LoadHosts(); } + /// + /// 关于 + /// private void btnAbout_Click(object sender, EventArgs e) { Process.Start("https://github.com/wang9563/RemoteDesktopManage"); } #endregion - #region 页签控制 + #region 页签控制 [拖动/关闭] private void tabMain_MouseDown(object sender, MouseEventArgs e) { var index = InTabPageHead(e.Location, false); @@ -185,9 +207,9 @@ private void tabMain_MouseDown(object sender, MouseEventArgs e) { tabMain.SelectedIndex = index; - if (e.Button == MouseButtons.Right) - tabMain.ContextMenuStrip = menuTabPage; //弹出菜单 - else + if (e.Button == MouseButtons.Right) //右击,弹出菜单 + tabMain.ContextMenuStrip = menuTabPage; + else if (e.Button == MouseButtons.Left) //左击,进行拖动判定 { _tabMoving = true; _tabBeforeMoveX = e.X; @@ -254,8 +276,18 @@ private int InTabPageHead(Point location, bool zoomRange) private void tabMain_MouseUp(object sender, MouseEventArgs e) { - _tabMoving = false; - Cursor.Current = Cursors.Default; + if (e.Button == MouseButtons.Left) //完成拖动 + { + _tabMoving = false; + Cursor.Current = Cursors.Default; + } + else if (e.Button == MouseButtons.Middle) //关闭页签 + { + var index = InTabPageHead(e.Location, true); + if (index <= 0) return; + + CloseHost(index); + } } private void MainForm_MouseLeave(object sender, EventArgs e) @@ -265,15 +297,20 @@ private void MainForm_MouseLeave(object sender, EventArgs e) private void tmiCloseHost_Click(object sender, EventArgs e) { - var next = tabMain.SelectedIndex - 1; - var host = (AxMsRdpClient9NotSafeForScripting)tabMain.SelectedTab.Controls[0]; + CloseHost(tabMain.SelectedIndex); + } + + private void CloseHost(int pageIndex) + { + var page = tabMain.TabPages[pageIndex]; + var host = GetHost(pageIndex); if (host.Connected == 1) host.Disconnect(); host.Dispose(); - tabMain.SelectedTab.Dispose(); + tabMain.TabPages.Remove(page); - tabMain.SelectedIndex = next; + tabMain.SelectedIndex = pageIndex - (pageIndex == tabMain.TabPages.Count ? 1 : 0); } #endregion @@ -296,7 +333,7 @@ private void tmiEdit_Click(object sender, EventArgs e) var hostForm = new RemoteHostForm { StyleManager = metroStyleManager, RemoteHost = host }; if (hostForm.ShowDialog() == DialogResult.OK) - LoadHostConfig(); + LoadHosts(); } private void tmiDeleteHost_Click(object sender, EventArgs e) { @@ -324,5 +361,32 @@ private void tmiDeleteAll_Click(object sender, EventArgs e) #endregion + #region 界面切换与唤醒 [切换映射键盘] + private int _keyboardHookModeChanged; + private void MainForm_Activated(object sender, EventArgs e) + { + if (_keyboardHookModeChanged == 1) return; + _keyboardHookModeChanged = 1; + if (tabMain.SelectedIndex <= 0) return; + + var host = GetHost(tabMain.SelectedIndex); + if (host.RemoteProgram2.RemoteProgramMode) return; + + host.SecuredSettings3.KeyboardHookMode = 1; //在远程服务器上应用组合键。 + } + private void MainForm_Deactivate(object sender, EventArgs e) + { + if (_keyboardHookModeChanged == 2) return; + _keyboardHookModeChanged = 2; + if (tabMain.SelectedIndex <= 0) return; + + var host = GetHost(tabMain.SelectedIndex); + if (host.RemoteProgram2.RemoteProgramMode) return; + + host.SecuredSettings3.KeyboardHookMode = 2; //仅当客户端以全屏模式运行时才将组合键应用于远程服务器。这是默认值。 + } + #endregion + + } } diff --git a/RdpTest/RemoteHostForm.cs b/RdpTest/RemoteHostForm.cs index 878b2aa..302f49e 100644 --- a/RdpTest/RemoteHostForm.cs +++ b/RdpTest/RemoteHostForm.cs @@ -67,7 +67,9 @@ private void LoadRemoteHost() private void lbCopy_Click(object sender, EventArgs e) { RemoteHost = null; - lbCopy.Visible = false; + lbCopy.Visible = false; + lbStatus.Text = "[新增]"; + chIsParent.Enabled = true; } private void cbIsParent_CheckedChanged(object sender, System.EventArgs e)