From 9e3bc5d7eb9273e2ec6ab1262cda15b3634950a8 Mon Sep 17 00:00:00 2001 From: zmjack Date: Wed, 23 Feb 2022 00:41:01 +0800 Subject: [PATCH] v1.3.0 --- .../PortProxyGUI - Core31.csproj | 85 +++++ PortProxyGUI - Core31/Program.cs | 24 ++ PortProxyGUI - Core31/app.manifest | 76 +++++ PortProxyGUI - Core31/icon.ico | Bin 0 -> 129212 bytes .../About.Designer.cs | 0 .../About.cs | 4 + .../About.resx | 40 ++- .../About.zh-CN.resx | 40 ++- ...sproj => PortProxyGUI - NET35 - UI.csproj} | 54 ++-- .../PortProxyGUI.Designer.cs | 18 +- .../PortProxyGUI.cs | 76 +++-- .../PortProxyGUI.resx | 291 +++++++++++------- .../PortProxyGUI.zh-CN.resx | 216 ++++++------- PortProxyGUI - NET35/Program.cs | 1 + .../Properties/AssemblyInfo.cs | 4 +- .../SetProxy.Designer.cs | 42 +-- .../SetProxy.cs | 46 ++- .../SetProxy.resx | 201 +++++++----- .../SetProxy.zh-CN.resx | 221 ++++++++----- PortProxyGUI - NET35/app.manifest | 2 +- .../PortProxyGUI - NET45.csproj | 47 ++- .../Properties/AssemblyInfo.cs | 4 +- PortProxyGUI - NET45/app.manifest | 2 +- .../Data/ApplicationDbMigrationUtil.cs | 37 ++- .../Data/ApplicationDbScope.cs | 4 +- PortProxyGUI.Shared/Data/Rule.cs | 4 +- PortProxyGUI.Shared/ListViewColumnSorter.cs | 8 +- .../PortProxyGUI.Shared.projitems | 1 + PortProxyGUI.Shared/Util.cs | 17 + PortProxyGUI.sln | 27 +- PortProxyGUI/PortProxyGUI.csproj | 38 +-- PortProxyGUI/Program.cs | 7 +- docs/ui.png | Bin 14150 -> 18279 bytes 33 files changed, 1065 insertions(+), 572 deletions(-) create mode 100644 PortProxyGUI - Core31/PortProxyGUI - Core31.csproj create mode 100644 PortProxyGUI - Core31/Program.cs create mode 100644 PortProxyGUI - Core31/app.manifest create mode 100644 PortProxyGUI - Core31/icon.ico rename {PortProxyGUI => PortProxyGUI - NET35}/About.Designer.cs (100%) rename {PortProxyGUI => PortProxyGUI - NET35}/About.cs (93%) rename {PortProxyGUI => PortProxyGUI - NET35}/About.resx (99%) rename {PortProxyGUI => PortProxyGUI - NET35}/About.zh-CN.resx (99%) rename PortProxyGUI - NET35/{PortProxyGUI - NET35.csproj => PortProxyGUI - NET35 - UI.csproj} (84%) rename {PortProxyGUI => PortProxyGUI - NET35}/PortProxyGUI.Designer.cs (91%) rename {PortProxyGUI => PortProxyGUI - NET35}/PortProxyGUI.cs (82%) rename {PortProxyGUI => PortProxyGUI - NET35}/PortProxyGUI.resx (95%) rename {PortProxyGUI => PortProxyGUI - NET35}/PortProxyGUI.zh-CN.resx (99%) rename PortProxyGUI/SetProxyForm.Designer.cs => PortProxyGUI - NET35/SetProxy.Designer.cs (86%) rename PortProxyGUI/SetProxyForm.cs => PortProxyGUI - NET35/SetProxy.cs (77%) rename PortProxyGUI/SetProxyForm.zh-CN.resx => PortProxyGUI - NET35/SetProxy.resx (97%) rename PortProxyGUI/SetProxyForm.resx => PortProxyGUI - NET35/SetProxy.zh-CN.resx (97%) create mode 100644 PortProxyGUI.Shared/Util.cs diff --git a/PortProxyGUI - Core31/PortProxyGUI - Core31.csproj b/PortProxyGUI - Core31/PortProxyGUI - Core31.csproj new file mode 100644 index 0000000..ac879a3 --- /dev/null +++ b/PortProxyGUI - Core31/PortProxyGUI - Core31.csproj @@ -0,0 +1,85 @@ + + + + WinExe + netcoreapp3.1 + true + app.manifest + zmjack + nstandard.net + A manager of the netsh interface portproxy which is to evaluate TCP/IP port redirect on windows. + https://github.com/zmjack/PortProxyGUI + https://github.com/zmjack/PortProxyGUI + git + portproxy TCP/IP redirector + LICENSE.md + Copyright © nstandard.net 2020 + 1.3.0 + icon.ico + PortProxyGUI + PortProxyGUI + + + + none + false + AnyCPU + + + + AnyCPU + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + + + + + + + + + + + + Form + + + + + + Designer + + + + + + \ No newline at end of file diff --git a/PortProxyGUI - Core31/Program.cs b/PortProxyGUI - Core31/Program.cs new file mode 100644 index 0000000..02d1d48 --- /dev/null +++ b/PortProxyGUI - Core31/Program.cs @@ -0,0 +1,24 @@ +using PortProxyGUI.Data; +using System; +using System.Windows.Forms; + +namespace PortProxyGUI +{ + static class Program + { + public static readonly ApplicationDbScope SqliteDbScope = ApplicationDbScope.UseDefault(); + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + SqliteDbScope.Migrate(); + Application.SetHighDpiMode(HighDpiMode.SystemAware); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new PortProxyGUI()); + } + } +} diff --git a/PortProxyGUI - Core31/app.manifest b/PortProxyGUI - Core31/app.manifest new file mode 100644 index 0000000..169e618 --- /dev/null +++ b/PortProxyGUI - Core31/app.manifest @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PortProxyGUI - Core31/icon.ico b/PortProxyGUI - Core31/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a4316bc8f72a18ee39b46e6a2f6d54e16a412283 GIT binary patch literal 129212 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 l#kg5^)K@PWZ}lFJ^??|F32.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + Microsoft YaHei UI, 9pt + 12, 101 320, 25 - + 0 @@ -138,7 +141,7 @@ linkLabel1 - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -146,6 +149,9 @@ 3 + + Microsoft YaHei UI, 9pt + 12, 31 @@ -156,8 +162,8 @@ 1 - This is a free software. -You can browse the source code on GitHub. + It's open source software, +and you don't have to pay anything. MiddleCenter @@ -166,7 +172,7 @@ You can browse the source code on GitHub. label1 - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -174,6 +180,9 @@ You can browse the source code on GitHub. 2 + + Microsoft YaHei UI, 9pt + 12, 6 @@ -193,7 +202,7 @@ You can browse the source code on GitHub. label_version - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -201,6 +210,9 @@ You can browse the source code on GitHub. 1 + + Microsoft YaHei UI, 9pt + 12, 78 @@ -211,7 +223,7 @@ You can browse the source code on GitHub. 2 - Star me at: + Get software updates from GitHub, or star me: MiddleCenter @@ -220,7 +232,7 @@ You can browse the source code on GitHub. label_Star - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -228,7 +240,7 @@ You can browse the source code on GitHub. 0 - + True @@ -2395,7 +2407,7 @@ You can browse the source code on GitHub. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - + 3, 2, 3, 2 @@ -2409,6 +2421,6 @@ You can browse the source code on GitHub. About - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/PortProxyGUI/About.zh-CN.resx b/PortProxyGUI - NET35/About.zh-CN.resx similarity index 99% rename from PortProxyGUI/About.zh-CN.resx rename to PortProxyGUI - NET35/About.zh-CN.resx index 85bc6fe..c113133 100644 --- a/PortProxyGUI/About.zh-CN.resx +++ b/PortProxyGUI - NET35/About.zh-CN.resx @@ -112,19 +112,22 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + Microsoft YaHei UI, 9pt + 12, 101 320, 25 - + 0 @@ -138,7 +141,7 @@ linkLabel1 - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -146,6 +149,9 @@ 3 + + Microsoft YaHei UI, 9pt + 12, 31 @@ -156,8 +162,8 @@ 1 - 这是款免费软件, -您可以在 GitHub 上浏览项目源代码。 + 这是款开源软件, +并且您无需为此支付任何费用。 MiddleCenter @@ -166,7 +172,7 @@ label1 - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -174,6 +180,9 @@ 2 + + Microsoft YaHei UI, 9pt + 12, 6 @@ -193,7 +202,7 @@ label_version - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -201,6 +210,9 @@ 1 + + Microsoft YaHei UI, 9pt + 12, 78 @@ -211,7 +223,7 @@ 2 - 点星鼓励: + 从 GitHub 获取软件更新,或给予星星鼓励: MiddleCenter @@ -220,7 +232,7 @@ label_Star - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -2395,7 +2407,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - + 3, 2, 3, 2 @@ -2403,12 +2415,12 @@ CenterScreen - 关于 + About About - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/PortProxyGUI - NET35/PortProxyGUI - NET35.csproj b/PortProxyGUI - NET35/PortProxyGUI - NET35 - UI.csproj similarity index 84% rename from PortProxyGUI - NET35/PortProxyGUI - NET35.csproj rename to PortProxyGUI - NET35/PortProxyGUI - NET35 - UI.csproj index e8442cb..5f2f474 100644 --- a/PortProxyGUI - NET35/PortProxyGUI - NET35.csproj +++ b/PortProxyGUI - NET35/PortProxyGUI - NET35 - UI.csproj @@ -65,7 +65,7 @@ false - true + false LocalIntranet @@ -95,56 +95,38 @@ - - About.cs + Form - - About.designer.cs + About.cs - - PortProxyGUI.cs + Form - - PortProxyGUI.designer.cs + PortProxyGUI.cs - - SetProxyForm.cs - Form - - - SetProxyForm.designer.cs - SetProxyForm.cs - - - About.resx + + Form + + + SetProxy.cs + + About.cs - - About.zh-CN.resx + About.cs - - PortProxyGUI.resx + PortProxyGUI.cs - - PortProxyGUI.zh-CN.resx + PortProxyGUI.cs - - SetProxyForm.resx - SetProxyForm.cs - - - SetProxyForm.zh-CN.resx - SetProxyForm.cs - ResXFileCodeGenerator Resources.Designer.cs @@ -155,6 +137,12 @@ Resources.resx True + + SetProxy.cs + + + SetProxy.cs + diff --git a/PortProxyGUI/PortProxyGUI.Designer.cs b/PortProxyGUI - NET35/PortProxyGUI.Designer.cs similarity index 91% rename from PortProxyGUI/PortProxyGUI.Designer.cs rename to PortProxyGUI - NET35/PortProxyGUI.Designer.cs index 715302f..672cbce 100644 --- a/PortProxyGUI/PortProxyGUI.Designer.cs +++ b/PortProxyGUI - NET35/PortProxyGUI.Designer.cs @@ -31,13 +31,13 @@ this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PortProxyGUI)); this.listViewProxies = new System.Windows.Forms.ListView(); - this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); - this.columnHeader2 = new System.Windows.Forms.ColumnHeader(); - this.columnHeader3 = new System.Windows.Forms.ColumnHeader(); - this.columnHeader4 = new System.Windows.Forms.ColumnHeader(); - this.columnHeader5 = new System.Windows.Forms.ColumnHeader(); - this.columnHeader6 = new System.Windows.Forms.ColumnHeader(); - this.columnHeader7 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem(); @@ -74,6 +74,7 @@ this.listViewProxies.View = System.Windows.Forms.View.Details; this.listViewProxies.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView1_ColumnClick); this.listViewProxies.DoubleClick += new System.EventHandler(this.listView1_DoubleClick); + this.listViewProxies.KeyUp += new System.Windows.Forms.KeyEventHandler(this.listViewProxies_KeyUp); this.listViewProxies.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseUp); // // columnHeader1 @@ -90,6 +91,7 @@ // // columnHeader4 // + this.columnHeader4.Tag = ""; resources.ApplyResources(this.columnHeader4, "columnHeader4"); // // columnHeader5 @@ -98,6 +100,7 @@ // // columnHeader6 // + this.columnHeader6.Tag = ""; resources.ApplyResources(this.columnHeader6, "columnHeader6"); // // columnHeader7 @@ -173,7 +176,6 @@ // // imageListProxies // - this.imageListProxies.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; this.imageListProxies.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListProxies.ImageStream"))); this.imageListProxies.TransparentColor = System.Drawing.Color.Transparent; this.imageListProxies.Images.SetKeyName(0, "disable.png"); diff --git a/PortProxyGUI/PortProxyGUI.cs b/PortProxyGUI - NET35/PortProxyGUI.cs similarity index 82% rename from PortProxyGUI/PortProxyGUI.cs rename to PortProxyGUI - NET35/PortProxyGUI.cs index e732df9..5f88365 100644 --- a/PortProxyGUI/PortProxyGUI.cs +++ b/PortProxyGUI - NET35/PortProxyGUI.cs @@ -1,6 +1,7 @@ using NStandard; using System; using System.Data; +using System.Drawing; using System.Linq; using System.Windows.Forms; using static System.Windows.Forms.ListViewItem; @@ -9,13 +10,15 @@ namespace PortProxyGUI { public partial class PortProxyGUI : Form { - public SetProxyForm SetProxyForm; + public SetProxy SetProxyForm; public About AboutForm; private ListViewColumnSorter lvwColumnSorter; public PortProxyGUI() { InitializeComponent(); + Font = Util.UiFont; + lvwColumnSorter = new ListViewColumnSorter(); listViewProxies.ListViewItemSorter = lvwColumnSorter; } @@ -44,7 +47,7 @@ namespace PortProxyGUI ListenPort = listenPort, ConnectTo = subItems[4].Text.Trim(), ConnectPort = connectPort, - Note = subItems[6].Text.Trim(), + Comment = subItems[6].Text.Trim(), Group = item.Group?.Header.Trim(), }; return rule; @@ -98,7 +101,7 @@ namespace PortProxyGUI foreach (var item in items) listViewProxies.Items.Remove(item); } - private void SetProxyForUpdate(SetProxyForm form) + private void SetProxyForUpdate(SetProxy form) { var item = listViewProxies.SelectedItems.OfType().FirstOrDefault(); try @@ -116,9 +119,14 @@ namespace PortProxyGUI private void InitProxyGroups(Data.Rule[] rules) { listViewProxies.Groups.Clear(); - var groups = rules.GroupBy(x => x.Group).Select(x => new ListViewGroup(x.Key)).ToArray(); + var groups = ( + from g in rules.GroupBy(x => x.Group) + let name = g.Key + where !name.IsNullOrWhiteSpace() + orderby name + select new ListViewGroup(name) + ).ToArray(); listViewProxies.Groups.AddRange(groups); - listViewProxies.ShowGroups = groups.Any(x => !x.Name.IsNullOrEmpty()); } private void InitProxyItems(Data.Rule[] rules, Data.Rule[] proxies) @@ -129,25 +137,40 @@ namespace PortProxyGUI var imageIndex = proxies.Any(p => p.EqualsWithKeys(rule)) ? 1 : 0; var group = listViewProxies.Groups.OfType().FirstOrDefault(x => x.Header == rule.Group); - var item = new ListViewItem - { - ImageIndex = imageIndex, - Tag = rule.Id, - Group = group, - }; - item.SubItems.AddRange(new[] - { - rule.Type, - rule.ListenOn, - rule.ListenPort.ToString(), - rule.ConnectTo, - rule.ConnectPort.ToString(), - rule.Note ?? "", - }); + var item = new ListViewItem(); + UpdateListViewItem(item, rule, imageIndex); listViewProxies.Items.Add(item); } } + public void UpdateListViewItem(ListViewItem item, Data.Rule rule, int imageIndex) + { + item.ImageIndex = imageIndex; + item.Tag = rule.Id; + item.SubItems.Clear(); + item.SubItems.AddRange(new[] + { + new ListViewSubItem(item, rule.Type), + new ListViewSubItem(item, rule.ListenOn), + new ListViewSubItem(item, rule.ListenPort.ToString()) { Tag = "Number" }, + new ListViewSubItem(item, rule.ConnectTo), + new ListViewSubItem(item, rule.ConnectPort.ToString ()) { Tag = "Number" }, + new ListViewSubItem(item, rule.Comment ?? ""), + }); + + if (rule.Group.IsNullOrWhiteSpace()) item.Group = null; + else + { + var group = listViewProxies.Groups.OfType().FirstOrDefault(x => x.Header == rule.Group); + if (group == null) + { + group = new ListViewGroup(rule.Group); + listViewProxies.Groups.Add(group); + } + item.Group = group; + } + } + public void RefreshProxyList() { var proxies = CmdUtil.GetProxies(); @@ -182,13 +205,13 @@ namespace PortProxyGUI case ToolStripMenuItem item when item == toolStripMenuItem_Disable: DisableSelectedProxies(); break; case ToolStripMenuItem item when item == toolStripMenuItem_New: - if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this); + if (SetProxyForm == null) SetProxyForm = new SetProxy(this); SetProxyForm.UseNormalMode(); SetProxyForm.ShowDialog(); break; case ToolStripMenuItem item when item == toolStripMenuItem_Modify: - if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this); + if (SetProxyForm == null) SetProxyForm = new SetProxy(this); SetProxyForUpdate(SetProxyForm); SetProxyForm.ShowDialog(); break; @@ -230,7 +253,7 @@ namespace PortProxyGUI var selectAny = _sender.SelectedItems.OfType().Any(); if (selectAny) { - if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this); + if (SetProxyForm == null) SetProxyForm = new SetProxy(this); SetProxyForUpdate(SetProxyForm); SetProxyForm.ShowDialog(); } @@ -263,5 +286,12 @@ namespace PortProxyGUI listViewProxies.Sort(); } + private void listViewProxies_KeyUp(object sender, KeyEventArgs e) + { + if (sender is ListView) + { + if (e.KeyCode == Keys.Delete) DeleteSelectedProxies(); + } + } } } diff --git a/PortProxyGUI/PortProxyGUI.resx b/PortProxyGUI - NET35/PortProxyGUI.resx similarity index 95% rename from PortProxyGUI/PortProxyGUI.resx rename to PortProxyGUI - NET35/PortProxyGUI.resx index 01b61ca..760c28a 100644 --- a/PortProxyGUI/PortProxyGUI.resx +++ b/PortProxyGUI - NET35/PortProxyGUI.resx @@ -1,4 +1,64 @@ - + + + @@ -52,15 +112,15 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 24 @@ -95,15 +155,103 @@ 100 - Note + Comment 104 - + 17, 17 - + + + 155, 176 + + + contextMenuStrip1 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Fill + + + Microsoft YaHei UI, 9pt + + + 0, 0 + + + 4, 3, 4, 3 + + + 704, 421 + + + 182, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc + CAAAAk1TRnQBSQFMAgEBAgEAASABAQEgAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wQACvQ0AAH/AZQKFwGU + Af8CAAH/AboKlQG6Af8iAAGUDBcBlAIAAboMlQG6IgAOFwIADpUiAAQXARYB9AL/AfQBFgQXAgAOlSIA + AxcBFgH/Ab0BFgGUAfQB/wEWAxcCAAWVArsHlSIAAxcB9AG9AhcBlAH/AvQDFwIABJUBugL/AcEGlSIA + AxcB/wEWARcBlAH/ApQB/wMXAgADlQG6Af8BwQG6Af8BwQWVIgADFwH/ApQB/wGUARcBFgH/AxcCAAOV + Af8BwQKVAboB/wHBBJUiAAMXAvQB/wGUAhcBvQH0AxcCAAiVAboB/wHBA5UiAAMXARYB/wH0AZQBFgG9 + Af8BFgMXAgAJlQG6Af8DlSIABBcBFgH0Av8B9AEWBBcB/wEADpUB/yEADhcB/wEADpUB/yEAAZQMFwGU + AgABugyVAboiAAH/AZQKFwGUAf8CAAH/AboKlQG6Af80AAH/CPQkAAFCAU0BPgcAAT4DAAEoAwABQAMA + ARADAAEBAQABAQUAAYAXAAP/AQAB4AEHAv8EAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA + AQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA + AQEBgAEBBAABgAEAAYAFAAGAAQABgAUAAYABAQGAAQEEAAGAAQEBgAEBBAAC/wHgAQ8EAAs= + + + + 0 + + + listViewProxies + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + 154, 22 @@ -155,99 +303,14 @@ About - - 155, 176 - - - contextMenuStrip1 - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - Fill - - - 0, 0 - - - 4, 3, 4, 3 - - - 284, 261 - - - 182, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs - LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu - SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA3AgAAAJNU0Z0AUkBTAIBAQIB - AAGUAQABlAEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAEQAwABAQEAAQgG - AAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEAAfABygGmAQABMwUAATMB - AAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEAAYABfAH/AQACUAH/AQAB - kwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFmAwABmQMAAcwCAAEzAwAC - MwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZAgABZgHMAgABZgH/AgAB - mQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFmAgABzAGZAgACzAIAAcwB - /wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEzAQABmQEAATMBAAHMAQAB - MwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFmAgABMwFmATMBAAEzAmYB - AAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFmAQABMwKZAQABMwGZAcwB - AAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEAATMBzAH/AQABMwH/ATMB - AAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFmAQABZgEAAWYBAAGZAQAB - ZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFmATMBzAEAAWYBMwH/AQAC - ZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFmAQABZgKZAQABZgGZAcwB - AAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEAAWYB/wIAAWYB/wEzAQAB - ZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZAQABmQEAAZkBAAHMAQAB - mQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEzAQABmQEzAWYBAAGZAWYB - mQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/AQABmQHMAgABmQHMATMB - AAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEAAZkBzAFmAQABmQH/AZkB - AAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHMAQABzAEAAZkBMwIAAcwC - MwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFmATMBAAGZAmYBAAHMAWYB - mQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZAQABzAGZAcwBAAHMAZkB - /wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ATMBAAGZAf8BZgEAAcwB - /wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHMATMCAAH/AjMBAAH/ATMB - ZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJmAQAB/wFmAZkBAAH/AWYB - zAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHMAQAB/wGZAf8BAAH/AcwC - AAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEAAcwB/wFmAQAC/wGZAQAC - /wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEAASEBAAGlAQADXwEAA3cB - AAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7Af8BAAGkAqABAAOAAwAB - /wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8EAAr0NAAB/wGUChcBlAH/AgAB/wG6CpUBugH/IgAB - lAwXAZQCAAG6DJUBuiIADhcCAA6VIgAEFwEWAfQC/wH0ARYEFwIADpUiAAMXARYB/wG9ARYBlAH0Af8B - FgMXAgAFlQK7B5UiAAMXAfQBvQIXAZQB/wL0AxcCAASVAboC/wHBBpUiAAMXAf8BFgEXAZQB/wKUAf8D - FwIAA5UBugH/AcEBugH/AcEFlSIAAxcB/wKUAf8BlAEXARYB/wMXAgADlQH/AcEClQG6Af8BwQSVIgAD - FwL0Af8BlAIXAb0B9AMXAgAIlQG6Af8BwQOVIgADFwEWAf8B9AGUARYBvQH/ARYDFwIACZUBugH/A5Ui - AAQXARYB9AL/AfQBFgQXAf8BAA6VAf8hAA4XAf8BAA6VAf8hAAGUDBcBlAIAAboMlQG6IgAB/wGUChcB - lAH/AgAB/wG6CpUBugH/NAAB/wj0JAABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD - /wEAAeABBwL/BAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEE - AAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAAGABQAB - gAEAAYAFAAGAAQEBgAEBBAABgAEBAYABAQQAAv8B4AEPBAAL - - - - 0 - - - listViewProxies - - - System.Windows.Forms.ListView, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - + True - 7, 17 + 6, 12 - 284, 261 + 704, 421 @@ -2420,114 +2483,114 @@ columnHeader1 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader2 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader3 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader4 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader5 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader6 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader7 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripMenuItem_Enable - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripMenuItem_Disable - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripSeparator3 - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripMenuItem_Refresh - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripSeparator2 - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripMenuItem_New - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripMenuItem_Modify - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripMenuItem_Delete - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripSeparator1 - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 toolStripMenuItem_About - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 imageListProxies - System.Windows.Forms.ImageList, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 PortProxyGUI - System.Windows.Forms.Form, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/PortProxyGUI/PortProxyGUI.zh-CN.resx b/PortProxyGUI - NET35/PortProxyGUI.zh-CN.resx similarity index 99% rename from PortProxyGUI/PortProxyGUI.zh-CN.resx rename to PortProxyGUI - NET35/PortProxyGUI.zh-CN.resx index 3d63e63..6bc18b9 100644 --- a/PortProxyGUI/PortProxyGUI.zh-CN.resx +++ b/PortProxyGUI - NET35/PortProxyGUI.zh-CN.resx @@ -112,15 +112,15 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 24 @@ -143,18 +143,24 @@ 100 - 连接地址 + 转发地址 140 - 连接端口 + 转发端口 100 - + + 备注 + + + 104 + + 17, 17 @@ -165,30 +171,33 @@ contextMenuStrip1 - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + Fill + + Microsoft YaHei UI, 9pt + 0, 0 - 3, 2, 3, 2 + 4, 3, 4, 3 - 624, 361 + 704, 421 182, 17 - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc - CAAAAk1TRnQBSQFMAgEBAgEAAUABAAFYAQABEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAASABAQEkAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -235,7 +244,7 @@ listViewProxies - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this @@ -258,6 +267,15 @@ 151, 6 + + 154, 22 + + + 刷新 (&F) + + + 151, 6 + 154, 22 @@ -279,15 +297,6 @@ 151, 6 - - 154, 22 - - - 刷新 (&F) - - - 151, 6 - 154, 22 @@ -301,7 +310,7 @@ 6, 12 - 624, 361 + 704, 421 @@ -2462,7 +2471,7 @@ - 3, 2, 3, 2 + 4, 3, 4, 3 CenterScreen @@ -2474,112 +2483,37 @@ columnHeader1 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader2 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader3 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader4 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader5 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader6 - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem_Enable - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem_Disable - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator3 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem_New - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem_Modify - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem_Delete - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator1 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem_Refresh - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator2 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripMenuItem_About - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - imageListProxies - - - System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - PortProxyGUI - - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 备注 + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 columnHeader7 @@ -2587,4 +2521,76 @@ System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + toolStripMenuItem_Enable + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem_Disable + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator3 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem_Refresh + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator2 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem_New + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem_Modify + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem_Delete + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItem_About + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + imageListProxies + + + System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + PortProxyGUI + + + System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/PortProxyGUI - NET35/Program.cs b/PortProxyGUI - NET35/Program.cs index 2e2c332..8a8a627 100644 --- a/PortProxyGUI - NET35/Program.cs +++ b/PortProxyGUI - NET35/Program.cs @@ -1,5 +1,6 @@ using PortProxyGUI.Data; using System; +using System.Drawing; using System.Windows.Forms; namespace PortProxyGUI diff --git a/PortProxyGUI - NET35/Properties/AssemblyInfo.cs b/PortProxyGUI - NET35/Properties/AssemblyInfo.cs index 938d4a3..4e0baa1 100644 --- a/PortProxyGUI - NET35/Properties/AssemblyInfo.cs +++ b/PortProxyGUI - NET35/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0.0")] -[assembly: AssemblyFileVersion("1.2.0.0")] +[assembly: AssemblyVersion("1.3.0.0")] +[assembly: AssemblyFileVersion("1.3.0.0")] diff --git a/PortProxyGUI/SetProxyForm.Designer.cs b/PortProxyGUI - NET35/SetProxy.Designer.cs similarity index 86% rename from PortProxyGUI/SetProxyForm.Designer.cs rename to PortProxyGUI - NET35/SetProxy.Designer.cs index 6eaaab7..1864433 100644 --- a/PortProxyGUI/SetProxyForm.Designer.cs +++ b/PortProxyGUI - NET35/SetProxy.Designer.cs @@ -1,6 +1,6 @@ namespace PortProxyGUI { - partial class SetProxyForm + partial class SetProxy { /// /// Required designer variable. @@ -28,7 +28,7 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetProxyForm)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetProxy)); this.label_ListenOn = new System.Windows.Forms.Label(); this.textBox_ListenOn = new System.Windows.Forms.TextBox(); this.label_ConnectTo = new System.Windows.Forms.Label(); @@ -40,9 +40,9 @@ this.label_ListenPort = new System.Windows.Forms.Label(); this.textBox_ListenPort = new System.Windows.Forms.TextBox(); this.comboBox_Type = new System.Windows.Forms.ComboBox(); - this.label_Note = new System.Windows.Forms.Label(); - this.textBox_Note = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); + this.label_Comment = new System.Windows.Forms.Label(); + this.textBox_Comment = new System.Windows.Forms.TextBox(); + this.label_Group = new System.Windows.Forms.Label(); this.comboBox_Group = new System.Windows.Forms.ComboBox(); this.SuspendLayout(); // @@ -110,20 +110,20 @@ resources.GetString("comboBox_Type.Items4")}); this.comboBox_Type.Name = "comboBox_Type"; // - // label_Note + // label_Comment // - resources.ApplyResources(this.label_Note, "label_Note"); - this.label_Note.Name = "label_Note"; + resources.ApplyResources(this.label_Comment, "label_Comment"); + this.label_Comment.Name = "label_Comment"; // // textBox_Note // - resources.ApplyResources(this.textBox_Note, "textBox_Note"); - this.textBox_Note.Name = "textBox_Note"; + resources.ApplyResources(this.textBox_Comment, "textBox_Note"); + this.textBox_Comment.Name = "textBox_Note"; // - // label1 + // label_Group // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; + resources.ApplyResources(this.label_Group, "label_Group"); + this.label_Group.Name = "label_Group"; // // comboBox_Group // @@ -131,15 +131,15 @@ this.comboBox_Group.FormattingEnabled = true; this.comboBox_Group.Name = "comboBox_Group"; // - // SetProxyForm + // SetProxy // this.AcceptButton = this.button_Set; resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.comboBox_Group); - this.Controls.Add(this.label1); - this.Controls.Add(this.textBox_Note); - this.Controls.Add(this.label_Note); + this.Controls.Add(this.label_Group); + this.Controls.Add(this.textBox_Comment); + this.Controls.Add(this.label_Comment); this.Controls.Add(this.comboBox_Type); this.Controls.Add(this.textBox_ListenPort); this.Controls.Add(this.label_ListenPort); @@ -154,7 +154,7 @@ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.MinimizeBox = false; - this.Name = "SetProxyForm"; + this.Name = "SetProxy"; this.TopMost = true; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetProxyForm_FormClosing); this.Load += new System.EventHandler(this.SetProxyForm_Load); @@ -176,9 +176,9 @@ private System.Windows.Forms.Label label_ListenPort; private System.Windows.Forms.TextBox textBox_ListenPort; private System.Windows.Forms.ComboBox comboBox_Type; - private System.Windows.Forms.Label label_Note; - private System.Windows.Forms.TextBox textBox_Note; - private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label_Comment; + private System.Windows.Forms.TextBox textBox_Comment; + private System.Windows.Forms.Label label_Group; private System.Windows.Forms.ComboBox comboBox_Group; } } \ No newline at end of file diff --git a/PortProxyGUI/SetProxyForm.cs b/PortProxyGUI - NET35/SetProxy.cs similarity index 77% rename from PortProxyGUI/SetProxyForm.cs rename to PortProxyGUI - NET35/SetProxy.cs index c0b045e..8a32394 100644 --- a/PortProxyGUI/SetProxyForm.cs +++ b/PortProxyGUI - NET35/SetProxy.cs @@ -1,13 +1,14 @@ using NStandard; using PortProxyGUI.Data; using System; +using System.Drawing; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Forms; namespace PortProxyGUI { - public partial class SetProxyForm : Form + public partial class SetProxy : Form { public readonly PortProxyGUI ParentWindow; private string AutoTypeString { get; } @@ -16,11 +17,21 @@ namespace PortProxyGUI private ListViewItem _listViewItem; private Rule _itemRule; - public SetProxyForm(PortProxyGUI parent) + public SetProxy(PortProxyGUI parent) { ParentWindow = parent; + InitializeComponent(); + Font = Util.UiFont; + AutoTypeString = comboBox_Type.Text = comboBox_Type.Items.OfType().First(); + var groupNames = ( + from g in parent.listViewProxies.Groups.OfType() + let header = g.Header + where !header.IsNullOrWhiteSpace() + select header + ).ToArray(); + comboBox_Group.Items.AddRange(groupNames); } public void UseNormalMode() @@ -36,7 +47,7 @@ namespace PortProxyGUI textBox_ListenPort.Text = ""; textBox_ConnectTo.Text = ""; textBox_ConnectPort.Text = ""; - textBox_Note.Text = ""; + textBox_Comment.Text = ""; } public void UseUpdateMode(ListViewItem item, Rule rule) @@ -53,7 +64,7 @@ namespace PortProxyGUI textBox_ListenPort.Text = rule.ListenPort.ToString(); textBox_ConnectTo.Text = rule.ConnectTo; textBox_ConnectPort.Text = rule.ConnectPort.ToString(); - textBox_Note.Text = rule.Note; + textBox_Comment.Text = rule.Comment; } private bool IsIPv6(string ip) @@ -90,7 +101,7 @@ namespace PortProxyGUI ListenPort = listenPort, ConnectTo = textBox_ConnectTo.Text.Trim(), ConnectPort = connectPort, - Note = textBox_Note.Text.Trim(), + Comment = textBox_Comment.Text.Trim(), Group = comboBox_Group.Text.Trim(), }; @@ -111,32 +122,13 @@ namespace PortProxyGUI CmdUtil.AddOrUpdateProxy(rule); Program.SqliteDbScope.Add(rule); - _listViewItem.ImageIndex = 1; - var subItems = _listViewItem.SubItems; - subItems[1].Text = rule.Type; - subItems[2].Text = rule.ListenOn; - subItems[3].Text = rule.ListenPort.ToString(); - subItems[4].Text = rule.ConnectTo; - subItems[5].Text = rule.ConnectPort.ToString(); - subItems[6].Text = rule.Note; - - if (rule.Group == null) _listViewItem.Group = null; - else - { - var listView = ParentWindow.listViewProxies; - var group = listView.Groups.OfType().FirstOrDefault(x => x.Name == rule.Group); - if (group == null) - { - group = new ListViewGroup(rule.Group); - listView.Groups.Add(group); - } - - _listViewItem.Group = group; - } + ParentWindow.UpdateListViewItem(_listViewItem, rule, 1); } else { CmdUtil.AddOrUpdateProxy(rule); + Program.SqliteDbScope.Add(rule); + ParentWindow.RefreshProxyList(); } diff --git a/PortProxyGUI/SetProxyForm.zh-CN.resx b/PortProxyGUI - NET35/SetProxy.resx similarity index 97% rename from PortProxyGUI/SetProxyForm.zh-CN.resx rename to PortProxyGUI - NET35/SetProxy.resx index 59596b9..a5a6423 100644 --- a/PortProxyGUI/SetProxyForm.zh-CN.resx +++ b/PortProxyGUI - NET35/SetProxy.resx @@ -122,11 +122,18 @@ True + + Microsoft YaHei UI, 9pt + - 12, 41 + 14, 57 + + + + 4, 0, 4, 0 - 59, 12 + 60, 17 0 @@ -146,15 +153,17 @@ 14 - - 83, 38 + + Microsoft YaHei UI, 9pt + + + 97, 54 - - 3, 2, 3, 2 + 4, 3, 4, 3 - 126, 21 + 146, 23 0 @@ -180,11 +189,17 @@ True + + Microsoft YaHei UI, 9pt + - 12, 66 + 14, 86 + + + 4, 0, 4, 0 - 65, 12 + 71, 17 0 @@ -204,14 +219,17 @@ 12 + + Microsoft YaHei UI, 9pt + - 83, 63 + 97, 83 - 3, 2, 3, 2 + 4, 3, 4, 3 - 126, 21 + 146, 23 3 @@ -231,14 +249,17 @@ 11 + + Microsoft YaHei UI, 9pt + - 256, 63 + 299, 83 - 3, 2, 3, 2 + 4, 3, 4, 3 - 73, 21 + 84, 23 4 @@ -261,11 +282,17 @@ True + + Microsoft YaHei UI, 9pt + - 215, 66 + 251, 86 + + + 4, 0, 4, 0 - 29, 12 + 32, 17 0 @@ -285,11 +312,17 @@ 9 + + Microsoft YaHei UI, 9pt + - 217, 98 + 258, 122 + + + 4, 4, 4, 4 - 112, 21 + 125, 32 6 @@ -312,11 +345,17 @@ True + + Microsoft YaHei UI, 9pt + - 12, 9 + 14, 15 + + + 4, 0, 4, 0 - 29, 12 + 36, 17 0 @@ -339,11 +378,17 @@ True + + Microsoft YaHei UI, 9pt + - 215, 41 + 251, 57 + + + 4, 0, 4, 0 - 29, 12 + 32, 17 0 @@ -363,14 +408,17 @@ 6 + + Microsoft YaHei UI, 9pt + - 256, 38 + 299, 54 - 3, 2, 3, 2 + 4, 3, 4, 3 - 73, 21 + 84, 23 2 @@ -390,8 +438,8 @@ 5 - - Popup + + Microsoft YaHei UI, 9pt (Auto) @@ -409,13 +457,13 @@ v6tov6 - 83, 6 + 97, 12 - 3, 2, 3, 2 + 4, 3, 4, 3 - 126, 20 + 146, 25 5 @@ -432,44 +480,53 @@ 4 - + True - + + Microsoft YaHei UI, 9pt + + NoControl - - 12, 102 + + 14, 130 - - 29, 12 + + 4, 0, 4, 0 - + + 64, 17 + + 7 - - Note + + Comment - - label_Note + + label_Comment - + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 3 + + Microsoft YaHei UI, 9pt + - 83, 98 + 97, 127 - 3, 2, 3, 2 + 4, 3, 4, 3 - 126, 21 + 146, 23 8 @@ -489,47 +546,53 @@ 2 - + True - + + Microsoft YaHei UI, 9pt + + NoControl - - 215, 9 + + 251, 15 - - 35, 12 + + 4, 0, 4, 0 - + + 45, 17 + + 9 - + Group - - label1 + + label_Group - + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 1 - - Popup + + Microsoft YaHei UI, 9pt - 256, 6 + 299, 12 - 3, 2, 3, 2 + 4, 3, 4, 3 - 73, 20 + 84, 25 10 @@ -553,7 +616,7 @@ 6, 12 - 344, 131 + 398, 169 @@ -2714,7 +2777,7 @@ - 3, 2, 3, 2 + 4, 3, 4, 3 Manual @@ -2723,7 +2786,7 @@ Set Proxy - SetProxyForm + SetProxy System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/PortProxyGUI/SetProxyForm.resx b/PortProxyGUI - NET35/SetProxy.zh-CN.resx similarity index 97% rename from PortProxyGUI/SetProxyForm.resx rename to PortProxyGUI - NET35/SetProxy.zh-CN.resx index 59596b9..10b6dad 100644 --- a/PortProxyGUI/SetProxyForm.resx +++ b/PortProxyGUI - NET35/SetProxy.zh-CN.resx @@ -122,17 +122,24 @@ True + + Microsoft YaHei UI, 9pt + - 12, 41 + 14, 57 + + + + 4, 0, 4, 0 - 59, 12 + 60, 17 0 - Listen on + 监听地址 label_ListenOn @@ -146,15 +153,17 @@ 14 - - 83, 38 + + Microsoft YaHei UI, 9pt + + + 97, 54 - - 3, 2, 3, 2 + 4, 3, 4, 3 - 126, 21 + 146, 23 0 @@ -180,17 +189,23 @@ True + + Microsoft YaHei UI, 9pt + - 12, 66 + 14, 86 + + + 4, 0, 4, 0 - 65, 12 + 71, 17 0 - Connect to + 转发地址 label_ConnectTo @@ -204,14 +219,17 @@ 12 + + Microsoft YaHei UI, 9pt + - 83, 63 + 97, 83 - 3, 2, 3, 2 + 4, 3, 4, 3 - 126, 21 + 146, 23 3 @@ -231,14 +249,17 @@ 11 + + Microsoft YaHei UI, 9pt + - 256, 63 + 299, 83 - 3, 2, 3, 2 + 4, 3, 4, 3 - 73, 21 + 84, 23 4 @@ -261,17 +282,23 @@ True + + Microsoft YaHei UI, 9pt + - 215, 66 + 251, 86 + + + 4, 0, 4, 0 - 29, 12 + 32, 17 0 - Port + 端口 label_ConnectPort @@ -285,17 +312,23 @@ 9 + + Microsoft YaHei UI, 9pt + - 217, 98 + 258, 122 + + + 4, 4, 4, 4 - 112, 21 + 125, 32 6 - Set + 设置 button_Set @@ -312,17 +345,23 @@ True + + Microsoft YaHei UI, 9pt + - 12, 9 + 14, 15 + + + 4, 0, 4, 0 - 29, 12 + 36, 17 0 - Type + 类型 label_Type @@ -339,17 +378,23 @@ True + + Microsoft YaHei UI, 9pt + - 215, 41 + 251, 57 + + + 4, 0, 4, 0 - 29, 12 + 32, 17 0 - Port + 端口 label_ListenPort @@ -363,14 +408,17 @@ 6 + + Microsoft YaHei UI, 9pt + - 256, 38 + 299, 54 - 3, 2, 3, 2 + 4, 3, 4, 3 - 73, 21 + 84, 23 2 @@ -390,11 +438,11 @@ 5 - - Popup + + Microsoft YaHei UI, 9pt - (Auto) + (自动) v4tov4 @@ -409,13 +457,13 @@ v6tov6 - 83, 6 + 97, 12 - 3, 2, 3, 2 + 4, 3, 4, 3 - 126, 20 + 146, 25 5 @@ -432,44 +480,53 @@ 4 - + True - + + Microsoft YaHei UI, 9pt + + NoControl - - 12, 102 + + 14, 130 - - 29, 12 + + 4, 0, 4, 0 - + + 64, 17 + + 7 - - Note + + 备注 - - label_Note + + label_Comment - + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 3 + + Microsoft YaHei UI, 9pt + - 83, 98 + 97, 127 - 3, 2, 3, 2 + 4, 3, 4, 3 - 126, 21 + 146, 23 8 @@ -489,47 +546,53 @@ 2 - + True - + + Microsoft YaHei UI, 9pt + + NoControl - - 215, 9 + + 251, 15 - - 35, 12 + + 4, 0, 4, 0 - + + 45, 17 + + 9 - - Group + + 分组 - - label1 + + label_Group - + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 1 - - Popup + + Microsoft YaHei UI, 9pt - 256, 6 + 299, 12 - 3, 2, 3, 2 + 4, 3, 4, 3 - 73, 20 + 84, 25 10 @@ -546,14 +609,14 @@ 0 - + True - + 6, 12 - 344, 131 + 398, 169 @@ -2714,7 +2777,7 @@ - 3, 2, 3, 2 + 4, 3, 4, 3 Manual @@ -2723,7 +2786,7 @@ Set Proxy - SetProxyForm + SetProxy System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/PortProxyGUI - NET35/app.manifest b/PortProxyGUI - NET35/app.manifest index 06dba89..f6a3bf4 100644 --- a/PortProxyGUI - NET35/app.manifest +++ b/PortProxyGUI - NET35/app.manifest @@ -19,8 +19,8 @@ - + diff --git a/PortProxyGUI - NET45/PortProxyGUI - NET45.csproj b/PortProxyGUI - NET45/PortProxyGUI - NET45.csproj index 1b9fd51..5509a2b 100644 --- a/PortProxyGUI - NET45/PortProxyGUI - NET45.csproj +++ b/PortProxyGUI - NET45/PortProxyGUI - NET45.csproj @@ -68,7 +68,7 @@ false - true + false LocalIntranet @@ -100,55 +100,46 @@ - + About.cs Form - - About.designer.cs - About.cs + + About.Designer.cs - + PortProxyGUI.cs Form - - PortProxyGUI.designer.cs - PortProxyGUI.cs + + PortProxyGUI.Designer.cs - - SetProxyForm.cs + + SetProxy.cs Form - - SetProxyForm.designer.cs - SetProxyForm.cs + + SetProxy.Designer.cs - + About.resx - About.cs - + About.zh-CN.resx - About.cs - + PortProxyGUI.resx - PortProxyGUI.cs - + PortProxyGUI.zh-CN.resx - PortProxyGUI.cs - - SetProxyForm.resx - SetProxyForm.cs + + SetProxy.resx - - SetProxyForm.zh-CN.resx - SetProxyForm.cs + + SetProxy.zh-CN.resx ResXFileCodeGenerator diff --git a/PortProxyGUI - NET45/Properties/AssemblyInfo.cs b/PortProxyGUI - NET45/Properties/AssemblyInfo.cs index 938d4a3..4e0baa1 100644 --- a/PortProxyGUI - NET45/Properties/AssemblyInfo.cs +++ b/PortProxyGUI - NET45/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0.0")] -[assembly: AssemblyFileVersion("1.2.0.0")] +[assembly: AssemblyVersion("1.3.0.0")] +[assembly: AssemblyFileVersion("1.3.0.0")] diff --git a/PortProxyGUI - NET45/app.manifest b/PortProxyGUI - NET45/app.manifest index 06dba89..f6a3bf4 100644 --- a/PortProxyGUI - NET45/app.manifest +++ b/PortProxyGUI - NET45/app.manifest @@ -19,8 +19,8 @@ - + diff --git a/PortProxyGUI.Shared/Data/ApplicationDbMigrationUtil.cs b/PortProxyGUI.Shared/Data/ApplicationDbMigrationUtil.cs index 07f3e29..41c6b9a 100644 --- a/PortProxyGUI.Shared/Data/ApplicationDbMigrationUtil.cs +++ b/PortProxyGUI.Shared/Data/ApplicationDbMigrationUtil.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Reflection; +using System.Windows.Forms; namespace PortProxyGUI.Data { @@ -29,8 +31,20 @@ namespace PortProxyGUI.Data { var migration = GetLastMigration(); var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version; + if (new Version(migration.ProductVersion) > assemblyVersion) - throw new InvalidOperationException("The current software version cannot use the configuration. Please download the latest version (https://github.com/zmjack/PortProxyGUI)."); + { + if (MessageBox.Show(@"The current software version cannot use the configuration. + +You need to use a newer version of PortProxyGUI. + +Would you like to download it now?", "Upgrade", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) + { + Process.Start("explorer.exe", "https://github.com/zmjack/PortProxyGUI/releases"); + } + + Environment.Exit(0); + } } public Migration GetLastMigration() @@ -77,6 +91,27 @@ namespace PortProxyGUI.Data "ALTER TABLE rules ADD Note text;", "ALTER TABLE rules ADD `Group` text;", }, + + [new MigrationKey { MigrationId = "202202221635", ProductVersion = "1.3.0" }] = new[] + { + "ALTER TABLE rules RENAME TO rulesOld;", + "DROP INDEX IX_Rules_Type_ListenOn_ListenPort;", + + @"CREATE TABLE rules ( + Id text PRIMARY KEY, + Type text, + ListenOn text, + ListenPort integer, + ConnectTo text, + ConnectPort integer, + Comment text, + `Group` text +);", + "CREATE UNIQUE INDEX IX_Rules_Type_ListenOn_ListenPort ON Rules ( Type, ListenOn, ListenPort );", + + "INSERT INTO rules SELECT Id, Type, ListenOn, ListenPort, ConnectTo, ConnectPort, Note, `Group` FROM rulesOld;", + "DROP TABLE rulesOld;", + }, }; } } diff --git a/PortProxyGUI.Shared/Data/ApplicationDbScope.cs b/PortProxyGUI.Shared/Data/ApplicationDbScope.cs index 6c3765c..24800df 100644 --- a/PortProxyGUI.Shared/Data/ApplicationDbScope.cs +++ b/PortProxyGUI.Shared/Data/ApplicationDbScope.cs @@ -43,7 +43,7 @@ namespace PortProxyGUI.Data var newid = Guid.NewGuid().ToString(); if (obj is Rule rule) - Sql($"INSERT INTO Rules (Id, Type, ListenOn, ListenPort, ConnectTo, ConnectPort, Note, `Group`) VALUES ({newid}, {rule.Type}, {rule.ListenOn}, {rule.ListenPort}, {rule.ConnectTo}, {rule.ConnectPort}, {rule.Note ?? ""}, {rule.Group ?? ""});"); + Sql($"INSERT INTO Rules (Id, Type, ListenOn, ListenPort, ConnectTo, ConnectPort, Comment, `Group`) VALUES ({newid}, {rule.Type}, {rule.ListenOn}, {rule.ListenPort}, {rule.ConnectTo}, {rule.ConnectPort}, {rule.Comment ?? ""}, {rule.Group ?? ""});"); else throw new NotSupportedException($"Adding {obj.GetType().FullName} is not supported."); } public void AddRange(IEnumerable objs) where T : class @@ -53,7 +53,7 @@ namespace PortProxyGUI.Data public void Update(T obj) where T : class { - if (obj is Rule rule) Sql($"UPDATE Rules SET Type={rule.Type}, ListenOn={rule.ListenOn}, ListenPort={rule.ListenPort}, ConnectTo={rule.ConnectTo}, ConnectPort={rule.ConnectPort}, Note={rule.Note ?? ""}, `Group`={rule.Group ?? ""} WHERE Id={rule.Id};"); + if (obj is Rule rule) Sql($"UPDATE Rules SET Type={rule.Type}, ListenOn={rule.ListenOn}, ListenPort={rule.ListenPort}, ConnectTo={rule.ConnectTo}, ConnectPort={rule.ConnectPort} WHERE Id={rule.Id};"); else throw new NotSupportedException($"Updating {obj.GetType().FullName} is not supported."); } public void UpdateRange(IEnumerable objs) where T : class diff --git a/PortProxyGUI.Shared/Data/Rule.cs b/PortProxyGUI.Shared/Data/Rule.cs index 30e0355..7b0d953 100644 --- a/PortProxyGUI.Shared/Data/Rule.cs +++ b/PortProxyGUI.Shared/Data/Rule.cs @@ -11,7 +11,7 @@ namespace PortProxyGUI.Data public int ListenPort { get; set; } public string ConnectTo { get; set; } public int ConnectPort { get; set; } - public string Note { get; set; } + public string Comment { get; set; } public string Group { get; set; } public bool Equals(Rule other) @@ -22,7 +22,7 @@ namespace PortProxyGUI.Data && ListenPort == other.ListenPort && ConnectTo == other.ConnectTo && ConnectPort == other.ConnectPort - && Note == other.Note + && Comment == other.Comment && Group == other.Group; } diff --git a/PortProxyGUI.Shared/ListViewColumnSorter.cs b/PortProxyGUI.Shared/ListViewColumnSorter.cs index 2738154..b7b7610 100644 --- a/PortProxyGUI.Shared/ListViewColumnSorter.cs +++ b/PortProxyGUI.Shared/ListViewColumnSorter.cs @@ -51,7 +51,13 @@ namespace PortProxyGUI listviewY = (ListViewItem)y; // Compare the two items - compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); + if (listviewX.SubItems[ColumnToSort].Tag?.ToString() == "Number" && listviewY.SubItems[ColumnToSort].Tag?.ToString() == "Number") + { + int.TryParse(listviewX.SubItems[ColumnToSort].Text, out var xint); + int.TryParse(listviewY.SubItems[ColumnToSort].Text, out var yint); + compareResult = ObjectCompare.Compare(xint, yint); + } + else compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); // Calculate correct return value based on object comparison if (OrderOfSort == SortOrder.Ascending) diff --git a/PortProxyGUI.Shared/PortProxyGUI.Shared.projitems b/PortProxyGUI.Shared/PortProxyGUI.Shared.projitems index 4b76964..ff4625d 100644 --- a/PortProxyGUI.Shared/PortProxyGUI.Shared.projitems +++ b/PortProxyGUI.Shared/PortProxyGUI.Shared.projitems @@ -18,5 +18,6 @@ + \ No newline at end of file diff --git a/PortProxyGUI.Shared/Util.cs b/PortProxyGUI.Shared/Util.cs new file mode 100644 index 0000000..008347f --- /dev/null +++ b/PortProxyGUI.Shared/Util.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; + +namespace PortProxyGUI +{ + public class Util + { + /// + /// Compatibility between .NET Framework and .NET Core. + /// + /// + public static readonly Font UiFont = new Font(new FontFamily("Microsoft Sans Serif"), 8f); + + } +} diff --git a/PortProxyGUI.sln b/PortProxyGUI.sln index 9483548..5023366 100644 --- a/PortProxyGUI.sln +++ b/PortProxyGUI.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30114.105 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32210.238 MinimumVisualStudioVersion = 15.0.26124.0 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PortProxyGUI", "PortProxyGUI\PortProxyGUI.csproj", "{7459E9F4-8B98-42D6-92CF-E90961E05C90}" EndProject @@ -9,17 +9,24 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "PortProxyGUI.Shared", "Port EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{E48EF63C-74A5-42B5-BFC5-20652E856B1F}" ProjectSection(SolutionItems) = preProject - README.md = README.md docs\ui.png = docs\ui.png EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortProxyGUI - NET45", "PortProxyGUI - NET45\PortProxyGUI - NET45.csproj", "{1B166039-E98C-404A-89A5-C981364B5546}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortProxyGUI - NET35", "PortProxyGUI - NET35\PortProxyGUI - NET35.csproj", "{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortProxyGUI - NET35 - UI", "PortProxyGUI - NET35\PortProxyGUI - NET35 - UI.csproj", "{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PortProxyGUI - Core31", "PortProxyGUI - Core31\PortProxyGUI - Core31.csproj", "{2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{444021F3-829E-4682-ACD5-B57FA46CC534}" + ProjectSection(SolutionItems) = preProject + README.md = README.md + EndProjectSection EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{1b166039-e98c-404a-89a5-c981364b5546}*SharedItemsImports = 4 + PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{2a54c624-1c2f-4ed7-b201-0e2981fb9cd9}*SharedItemsImports = 5 PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{56fb1cbc-bd89-47d7-a9d5-86f02eef480f}*SharedItemsImports = 4 PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{7459e9f4-8b98-42d6-92cf-e90961e05c90}*SharedItemsImports = 5 PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{b38ef2b9-e38d-4d6d-bf0d-7c1934d6cfdc}*SharedItemsImports = 13 @@ -69,6 +76,18 @@ Global {56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|x64.Build.0 = Release|Any CPU {56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|x86.ActiveCfg = Release|Any CPU {56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|x86.Build.0 = Release|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Debug|x64.ActiveCfg = Debug|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Debug|x64.Build.0 = Debug|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Debug|x86.ActiveCfg = Debug|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Debug|x86.Build.0 = Debug|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Release|Any CPU.Build.0 = Release|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Release|x64.ActiveCfg = Release|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Release|x64.Build.0 = Release|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Release|x86.ActiveCfg = Release|Any CPU + {2A54C624-1C2F-4ED7-B201-0E2981FB9CD9}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PortProxyGUI/PortProxyGUI.csproj b/PortProxyGUI/PortProxyGUI.csproj index a78cfff..6f38aa3 100644 --- a/PortProxyGUI/PortProxyGUI.csproj +++ b/PortProxyGUI/PortProxyGUI.csproj @@ -2,7 +2,7 @@ WinExe - netcoreapp3.1 + net6.0-windows true app.manifest zmjack @@ -14,7 +14,7 @@ portproxy TCP/IP redirector LICENSE.md Copyright © nstandard.net 2020 - 1.2.0 + 1.3.0 icon.ico @@ -28,6 +28,24 @@ AnyCPU + + + + + + + + + + + + + + + + + + True @@ -40,25 +58,9 @@ - - Form - Form - - Form - - - - - - Designer - - - SetProxyForm.Designer.cs - ResXFileCodeGenerator - diff --git a/PortProxyGUI/Program.cs b/PortProxyGUI/Program.cs index 02d1d48..42277c3 100644 --- a/PortProxyGUI/Program.cs +++ b/PortProxyGUI/Program.cs @@ -15,9 +15,10 @@ namespace PortProxyGUI static void Main() { SqliteDbScope.Migrate(); - Application.SetHighDpiMode(HighDpiMode.SystemAware); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); + + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); Application.Run(new PortProxyGUI()); } } diff --git a/docs/ui.png b/docs/ui.png index ce1bd3c82b3923faff1a2011d05ac54db4672e2d..655a28ac25edcc9241566e0a2ab395e58060e871 100644 GIT binary patch literal 18279 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 LymYSQi?{y+4XDB= literal 14150 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