From b3907762199973603332eb10340d34b441561e7a Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 25 Dec 2020 20:43:28 +0800 Subject: [PATCH] up4.0 --- v2rayN/v2rayN/Base/HttpWebServer.cs | 101 - v2rayN/v2rayN/Base/HttpWebServerB.cs | 141 - v2rayN/v2rayN/Forms/MainForm.Designer.cs | 161 +- v2rayN/v2rayN/Forms/MainForm.cs | 184 +- v2rayN/v2rayN/Forms/MainForm.resx | 473 ++- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 165 +- .../Forms/OptionSettingForm.Designer.cs | 297 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 157 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 3128 +++++++---------- .../Forms/OptionSettingForm.zh-Hans.resx | 171 +- .../Forms/RoutingSettingControl.Designer.cs | 159 + v2rayN/v2rayN/Forms/RoutingSettingControl.cs | 76 + .../v2rayN/Forms/RoutingSettingControl.resx | 456 +++ .../Forms/RoutingSettingControl.zh-Hans.resx | 184 + .../Forms/RoutingSettingForm.Designer.cs | 151 + v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 143 + v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 420 +++ .../Forms/RoutingSettingForm.zh-Hans.resx | 145 + .../Forms/SubSettingControl.Designer.cs | 53 +- v2rayN/v2rayN/Forms/SubSettingControl.cs | 25 +- v2rayN/v2rayN/Forms/SubSettingControl.resx | 337 +- .../Forms/SubSettingControl.zh-Hans.resx | 13 +- v2rayN/v2rayN/Forms/SubSettingForm.resx | 126 +- v2rayN/v2rayN/Global.cs | 20 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 52 +- v2rayN/v2rayN/Handler/DownloadHandle.cs | 87 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 2 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 113 +- .../HttpProxyHandler/HttpProxyHandle.cs | 94 +- .../HttpProxyHandler/PACServerHandle.cs | 209 -- v2rayN/v2rayN/Mode/ComboItem.cs | 14 + v2rayN/v2rayN/Mode/Config.cs | 90 +- v2rayN/v2rayN/Mode/ERoutingSort.cs | 11 + v2rayN/v2rayN/Mode/ESysProxyType.cs | 10 + v2rayN/v2rayN/Mode/V2rayConfig.cs | 10 +- v2rayN/v2rayN/Properties/AssemblyInfo.cs | 2 +- .../v2rayN/Properties/Resources.Designer.cs | 22 +- v2rayN/v2rayN/Properties/Resources.resx | 6 - v2rayN/v2rayN/Resources/abp.js.gz | Bin 4467 -> 0 bytes v2rayN/v2rayN/Resources/pac.txt.gz | Bin 44429 -> 0 bytes v2rayN/v2rayN/Sample/BlankPac.txt | 5 - v2rayN/v2rayN/Sample/SampleClientConfig.txt | 28 +- v2rayN/v2rayN/Tool/Utils.cs | 14 + v2rayN/v2rayN/v2rayN.csproj | 36 +- 44 files changed, 4178 insertions(+), 3913 deletions(-) delete mode 100644 v2rayN/v2rayN/Base/HttpWebServer.cs delete mode 100644 v2rayN/v2rayN/Base/HttpWebServerB.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingForm.cs create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingForm.resx create mode 100644 v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx delete mode 100644 v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs create mode 100644 v2rayN/v2rayN/Mode/ComboItem.cs create mode 100644 v2rayN/v2rayN/Mode/ERoutingSort.cs create mode 100644 v2rayN/v2rayN/Mode/ESysProxyType.cs delete mode 100644 v2rayN/v2rayN/Resources/abp.js.gz delete mode 100644 v2rayN/v2rayN/Resources/pac.txt.gz delete mode 100644 v2rayN/v2rayN/Sample/BlankPac.txt diff --git a/v2rayN/v2rayN/Base/HttpWebServer.cs b/v2rayN/v2rayN/Base/HttpWebServer.cs deleted file mode 100644 index 9fa72495..00000000 --- a/v2rayN/v2rayN/Base/HttpWebServer.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Net; -using System.Text; -using System.Threading; - -namespace v2rayN.Base -{ - public class HttpWebServer - { - private HttpListener _listener; - private Func _responderMethod; - - public HttpWebServer(string[] prefixes, Func method) - { - try - { - _listener = new HttpListener(); - - if (!HttpListener.IsSupported) - throw new NotSupportedException( - "Needs Windows XP SP2, Server 2003 or later."); - - // URI prefixes are required, for example - // "http://localhost:8080/index/". - if (prefixes == null || prefixes.Length == 0) - throw new ArgumentException("prefixes"); - - // A responder method is required - if (method == null) - throw new ArgumentException("method"); - - foreach (string s in prefixes) - _listener.Prefixes.Add(s); - - _responderMethod = method; - _listener.Start(); - - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - throw; - } - } - - public HttpWebServer(Func method, params string[] prefixes) - : this(prefixes, method) { } - - public void Run() - { - ThreadPool.QueueUserWorkItem((o) => - { - Utils.SaveLog("Webserver running..."); - try - { - while (_listener.IsListening) - { - ThreadPool.QueueUserWorkItem((c) => - { - HttpListenerContext ctx = c as HttpListenerContext; - try - { - string address = ctx.Request.LocalEndPoint.Address.ToString(); - Utils.SaveLog("Webserver Request " + address); - string rstr = _responderMethod(address); - byte[] buf = Encoding.UTF8.GetBytes(rstr); - ctx.Response.StatusCode = 200; - ctx.Response.ContentType = "application/x-ns-proxy-autoconfig"; - ctx.Response.ContentLength64 = buf.Length; - ctx.Response.OutputStream.Write(buf, 0, buf.Length); - } - catch - { - } // suppress any exceptions - finally - { - // always close the stream - ctx.Response.OutputStream.Close(); - } - }, _listener.GetContext()); - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } // suppress any exceptions - }); - } - - public void Stop() - { - if (_listener != null) - { - _listener.Stop(); - _listener.Close(); - _listener = null; - } - } - - } -} diff --git a/v2rayN/v2rayN/Base/HttpWebServerB.cs b/v2rayN/v2rayN/Base/HttpWebServerB.cs deleted file mode 100644 index fcbca1dd..00000000 --- a/v2rayN/v2rayN/Base/HttpWebServerB.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Threading; - -namespace v2rayN.Base -{ - public class HttpWebServerB - { - private TcpListener listener; - private int port; - private Func _responderMethod; - - public HttpWebServerB(int port, Func method) - { - this.port = port; - this._responderMethod = method; - - Thread thread = new Thread(StartListen) - { - IsBackground = true - }; - thread.Start(); - } - - public void Stop() - { - if (listener != null) - { - listener.Stop(); - listener = null; - } - } - - private void StartListen() - { - try - { - listener = new TcpListener(IPAddress.Any, port); - listener.Start(); - Utils.SaveLog("WebserverB running..."); - - while (true) - { - if (!listener.Pending()) - { - Thread.Sleep(100); - continue; - } - - TcpClient socket = listener.AcceptTcpClient(); - Thread thread = new Thread(new ParameterizedThreadStart(ProcessThread)) - { - IsBackground = true - }; - thread.Start(socket); - Thread.Sleep(1); - } - } - catch - { - Utils.SaveLog("WebserverB start fail."); - } - } - private void ProcessThread(object obj) - { - try - { - TcpClient socket = obj as TcpClient; - - BufferedStream inputStream = new BufferedStream(socket.GetStream()); - StreamWriter outputStream = new StreamWriter(new BufferedStream(socket.GetStream())); - if (inputStream.CanRead) - { - string data = ReadStream(inputStream); - - if (data.Contains("/pac/")) - { - if (_responderMethod != null) - { - string address = ((IPEndPoint)socket.Client.LocalEndPoint).Address.ToString(); - Utils.SaveLog("WebserverB Request " + address); - string pac = _responderMethod(address); - - if (inputStream.CanWrite) - { - WriteStream(outputStream, pac); - } - } - } - } - - outputStream.BaseStream.Flush(); - inputStream = null; - outputStream = null; - socket.Close(); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - private string ReadStream(Stream inputStream) - { - int nextchar; - string data = ""; - while (true) - { - nextchar = inputStream.ReadByte(); - if (nextchar == '\n') - { - break; - } - if (nextchar == '\r') - { - continue; - } - if (nextchar == -1) - { - Thread.Sleep(1); - continue; - }; - data += Convert.ToChar(nextchar); - } - return data; - } - - private void WriteStream(StreamWriter outputStream, string pac) - { - string content_type = "application/x-ns-proxy-autoconfig"; - outputStream.WriteLine("HTTP/1.1 200 OK"); - outputStream.WriteLine(String.Format("Content-Type:{0}", content_type)); - outputStream.WriteLine("Connection: close"); - outputStream.WriteLine(""); - outputStream.WriteLine(pac); - outputStream.Flush(); - } - } -} diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 86a73954..1b546c7b 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -63,22 +63,17 @@ this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); - this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); this.cmsMain = new System.Windows.Forms.ContextMenuStrip(this.components); this.menuSysAgentMode = new System.Windows.Forms.ToolStripMenuItem(); - this.menuNotEnabledHttp = new System.Windows.Forms.ToolStripMenuItem(); - this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); - this.menuGlobalPAC = new System.Windows.Forms.ToolStripMenuItem(); - this.menuKeep = new System.Windows.Forms.ToolStripMenuItem(); - this.menuKeepPAC = new System.Windows.Forms.ToolStripMenuItem(); this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem(); - this.menuKeepPACNothing = new System.Windows.Forms.ToolStripMenuItem(); + this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeepClear = new System.Windows.Forms.ToolStripMenuItem(); this.menuServers = new System.Windows.Forms.ToolStripMenuItem(); this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); - this.menuCopyPACUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuUpdateSubscriptions = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.menuExit = new System.Windows.Forms.ToolStripMenuItem(); @@ -93,8 +88,6 @@ this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslPacPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslPacPort = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); @@ -106,16 +99,16 @@ this.tsbSubUpdate = new System.Windows.Forms.ToolStripMenuItem(); this.tsbQRCodeSwitch = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.tsbOptionSetting = new System.Windows.Forms.ToolStripButton(); + this.tsbSetting = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbOptionSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbRoutingSetting = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); this.tsbReload = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); this.tsbCheckUpdate = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem(); - this.tsbCheckUpdatePACList = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.tsbCheckClearPACList = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateXrayCore = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); this.tsbHelp = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbAbout = new System.Windows.Forms.ToolStripMenuItem(); @@ -211,6 +204,7 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; // // menuAddVmessServer // @@ -388,11 +382,6 @@ this.menuExport2SubContent.Name = "menuExport2SubContent"; this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // - // qrCodeControl - // - resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); - this.qrCodeControl.Name = "qrCodeControl"; - // // tsbServer // resources.ApplyResources(this.tsbServer, "tsbServer"); @@ -400,6 +389,11 @@ this.tsbServer.Image = global::v2rayN.Properties.Resources.server; this.tsbServer.Name = "tsbServer"; // + // qrCodeControl + // + resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); + this.qrCodeControl.Name = "qrCodeControl"; + // // notifyMain // resources.ApplyResources(this.notifyMain, "notifyMain"); @@ -415,7 +409,6 @@ this.menuServers, this.menuAddServers2, this.menuScanScreen2, - this.menuCopyPACUrl, this.menuUpdateSubscriptions, this.toolStripSeparator2, this.menuExit}); @@ -428,56 +421,28 @@ // resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuNotEnabledHttp, - this.menuGlobal, - this.menuGlobalPAC, - this.menuKeep, - this.menuKeepPAC, this.menuKeepNothing, - this.menuKeepPACNothing}); + this.menuGlobal, + this.menuKeepClear}); this.menuSysAgentMode.Name = "menuSysAgentMode"; // - // menuNotEnabledHttp - // - resources.ApplyResources(this.menuNotEnabledHttp, "menuNotEnabledHttp"); - this.menuNotEnabledHttp.Name = "menuNotEnabledHttp"; - this.menuNotEnabledHttp.Click += new System.EventHandler(this.menuNotEnabledHttp_Click); - // - // menuGlobal - // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); - this.menuGlobal.Name = "menuGlobal"; - this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); - // - // menuGlobalPAC - // - resources.ApplyResources(this.menuGlobalPAC, "menuGlobalPAC"); - this.menuGlobalPAC.Name = "menuGlobalPAC"; - this.menuGlobalPAC.Click += new System.EventHandler(this.menuGlobalPAC_Click); - // - // menuKeep - // - resources.ApplyResources(this.menuKeep, "menuKeep"); - this.menuKeep.Name = "menuKeep"; - this.menuKeep.Click += new System.EventHandler(this.menuKeep_Click); - // - // menuKeepPAC - // - resources.ApplyResources(this.menuKeepPAC, "menuKeepPAC"); - this.menuKeepPAC.Name = "menuKeepPAC"; - this.menuKeepPAC.Click += new System.EventHandler(this.menuKeepPAC_Click); - // // menuKeepNothing // resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Name = "menuKeepNothing"; this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // - // menuKeepPACNothing + // menuGlobal // - resources.ApplyResources(this.menuKeepPACNothing, "menuKeepPACNothing"); - this.menuKeepPACNothing.Name = "menuKeepPACNothing"; - this.menuKeepPACNothing.Click += new System.EventHandler(this.menuKeepPACNothing_Click); + resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Name = "menuGlobal"; + this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); + // + // menuKeepClear + // + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); + this.menuKeepClear.Name = "menuKeepClear"; + this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuServers // @@ -496,12 +461,6 @@ this.menuScanScreen2.Name = "menuScanScreen2"; this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // - // menuCopyPACUrl - // - resources.ApplyResources(this.menuCopyPACUrl, "menuCopyPACUrl"); - this.menuCopyPACUrl.Name = "menuCopyPACUrl"; - this.menuCopyPACUrl.Click += new System.EventHandler(this.menuCopyPACUrl_Click); - // // menuUpdateSubscriptions // resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); @@ -559,8 +518,6 @@ this.toolSslHttpPortLab, this.toolSslHttpPort, this.toolSslBlank2, - this.toolSslPacPortLab, - this.toolSslPacPort, this.toolSslBlank3, this.toolSslServerSpeed, this.toolSslBlank4}); @@ -599,16 +556,6 @@ this.toolSslBlank2.Name = "toolSslBlank2"; this.toolSslBlank2.Spring = true; // - // toolSslPacPortLab - // - resources.ApplyResources(this.toolSslPacPortLab, "toolSslPacPortLab"); - this.toolSslPacPortLab.Name = "toolSslPacPortLab"; - // - // toolSslPacPort - // - resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort"); - this.toolSslPacPort.Name = "toolSslPacPort"; - // // toolSslBlank3 // resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3"); @@ -641,7 +588,7 @@ this.tsbSub, this.tsbQRCodeSwitch, this.toolStripSeparator8, - this.tsbOptionSetting, + this.tsbSetting, this.toolStripSeparator5, this.tsbReload, this.toolStripSeparator7, @@ -694,13 +641,27 @@ resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; // + // tsbSetting + // + resources.ApplyResources(this.tsbSetting, "tsbSetting"); + this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbOptionSetting, + this.tsbRoutingSetting}); + this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + this.tsbSetting.Name = "tsbSetting"; + // // tsbOptionSetting // resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); - this.tsbOptionSetting.Image = global::v2rayN.Properties.Resources.option; this.tsbOptionSetting.Name = "tsbOptionSetting"; this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // + // tsbRoutingSetting + // + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); + this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); + // // toolStripSeparator5 // resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); @@ -723,9 +684,7 @@ this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, - this.tsbCheckUpdatePACList, - this.toolStripSeparator13, - this.tsbCheckClearPACList}); + this.tsbCheckUpdateXrayCore}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // @@ -741,22 +700,11 @@ this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // - // tsbCheckUpdatePACList + // tsbCheckUpdateXrayCore // - resources.ApplyResources(this.tsbCheckUpdatePACList, "tsbCheckUpdatePACList"); - this.tsbCheckUpdatePACList.Name = "tsbCheckUpdatePACList"; - this.tsbCheckUpdatePACList.Click += new System.EventHandler(this.tsbCheckUpdatePACList_Click); - // - // toolStripSeparator13 - // - resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); - this.toolStripSeparator13.Name = "toolStripSeparator13"; - // - // tsbCheckClearPACList - // - resources.ApplyResources(this.tsbCheckClearPACList, "tsbCheckClearPACList"); - this.tsbCheckClearPACList.Name = "tsbCheckClearPACList"; - this.tsbCheckClearPACList.Click += new System.EventHandler(this.tsbCheckClearPACList_Click); + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); + this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator10 // @@ -880,7 +828,6 @@ private System.Windows.Forms.ToolStripMenuItem menuExport2ServerConfig; private System.Windows.Forms.ToolStrip tsMain; private System.Windows.Forms.ToolStripDropDownButton tsbServer; - private System.Windows.Forms.ToolStripButton tsbOptionSetting; private System.Windows.Forms.ToolStripButton tsbClose; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; @@ -893,9 +840,7 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; private System.Windows.Forms.ToolStripMenuItem menuSysAgentMode; private System.Windows.Forms.ToolStripMenuItem menuGlobal; - private System.Windows.Forms.ToolStripMenuItem menuGlobalPAC; - private System.Windows.Forms.ToolStripMenuItem menuKeep; - private System.Windows.Forms.ToolStripMenuItem menuCopyPACUrl; + private System.Windows.Forms.ToolStripMenuItem menuKeepClear; private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer; @@ -905,7 +850,6 @@ private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateN; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateCore; - private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdatePACList; private System.Windows.Forms.ToolStripMenuItem menuAddServers; private System.Windows.Forms.ToolStripMenuItem menuExport2ShareUrl; private System.Windows.Forms.ToolStripMenuItem menuSpeedServer; @@ -920,8 +864,6 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; private System.Windows.Forms.ToolStripMenuItem tsbSubSetting; private System.Windows.Forms.ToolStripMenuItem tsbSubUpdate; - private System.Windows.Forms.ToolStripMenuItem tsbCheckClearPACList; - private System.Windows.Forms.ToolStripMenuItem menuKeepPAC; private System.Windows.Forms.ToolStripMenuItem menuSelectAll; private System.Windows.Forms.ToolStripMenuItem menuExport2SubContent; private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; @@ -934,27 +876,26 @@ private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPort; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; - private System.Windows.Forms.ToolStripStatusLabel toolSslPacPort; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank3; private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPortLab; private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPortLab; - private System.Windows.Forms.ToolStripStatusLabel toolSslPacPortLab; private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4; private System.Windows.Forms.ToolStripMenuItem menuRemoveDuplicateServer; private System.Windows.Forms.ToolStripMenuItem menuTcpingServer; private System.Windows.Forms.ToolStripMenuItem menuRealPingServer; - private System.Windows.Forms.ToolStripMenuItem menuNotEnabledHttp; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; private System.Windows.Forms.ToolStripMenuItem menuUpdateSubscriptions; private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite; private System.Windows.Forms.ToolStripMenuItem menuKeepNothing; - private System.Windows.Forms.ToolStripMenuItem menuKeepPACNothing; private System.Windows.Forms.ToolStripMenuItem tsbTestMe; private System.Windows.Forms.ToolStripButton tsbReload; private System.Windows.Forms.ToolStripButton tsbQRCodeSwitch; private System.Windows.Forms.ToolStripMenuItem menuAddVlessServer; private System.Windows.Forms.ToolStripMenuItem menuAddTrojanServer; + private System.Windows.Forms.ToolStripDropDownButton tsbSetting; + private System.Windows.Forms.ToolStripMenuItem tsbOptionSetting; + private System.Windows.Forms.ToolStripMenuItem tsbRoutingSetting; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateXrayCore; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 90977fd0..0b7b2e55 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -35,8 +35,8 @@ namespace v2rayN.Forms { v2rayHandler.V2rayStop(); - HttpProxyHandle.CloseHttpAgent(config); - PACServerHandle.Stop(); + //HttpProxyHandle.CloseHttpAgent(config); + HttpProxyHandle.UpdateSysProxy(config, true); ConfigHandler.SaveConfig(ref config); statistics?.SaveToFile(); @@ -205,6 +205,8 @@ namespace v2rayN.Forms /// private void RefreshServersView() { + int index = lvServers.SelectedIndices.Count > 0 ? lvServers.SelectedIndices[0] : -1; + lvServers.BeginUpdate(); lvServers.Items.Clear(); @@ -270,15 +272,11 @@ namespace v2rayN.Forms } lvServers.EndUpdate(); - //if (lvServers.Items.Count > 0) - //{ - // if (lvServers.Items.Count <= testConfigIndex) - // { - // testConfigIndex = lvServers.Items.Count - 1; - // } - // lvServers.Items[testConfigIndex].Selected = true; - // lvServers.Select(); - //} + if (index >= 0 && index < lvServers.Items.Count && lvServers.Items.Count > 0) + { + lvServers.Items[index].Selected = true; + lvServers.EnsureVisible(index); // workaround + } } /// @@ -343,29 +341,8 @@ namespace v2rayN.Forms private void DisplayToolStatus() { - toolSslSocksPort.Text = - toolSslHttpPort.Text = - toolSslPacPort.Text = "OFF"; - toolSslSocksPort.Text = $"{Global.Loopback}:{config.inbound[0].localPort}"; - - if (config.listenerType != (int)ListenerType.noHttpProxy) - { - toolSslHttpPort.Text = $"{Global.Loopback}:{Global.httpPort}"; - if (config.listenerType == ListenerType.GlobalPac || - config.listenerType == ListenerType.PacOpenAndClear || - config.listenerType == ListenerType.PacOpenOnly) - { - if (PACServerHandle.IsRunning) - { - toolSslPacPort.Text = $"{HttpProxyHandle.GetPacUrl()}"; - } - else - { - toolSslPacPort.Text = UIRes.I18N("StartPacFailed"); - } - } - } + toolSslHttpPort.Text = $"{Global.Loopback}:{Global.httpPort}"; notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); } @@ -426,7 +403,7 @@ namespace v2rayN.Forms ConfigHandler.SaveConfig(ref config, false); statistics?.SaveToFile(); - ChangePACButtonStatus(config.listenerType); + ChangePACButtonStatus(config.sysProxyType); tsbReload.Enabled = true; } @@ -576,7 +553,7 @@ namespace v2rayN.Forms private void menuAddVlessServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.VLESS, -1); + ShowServerForm((int)EConfigType.VLESS, -1); } private void menuRemoveServer_Click(object sender, EventArgs e) @@ -758,7 +735,17 @@ namespace v2rayN.Forms //刷新 RefreshServers(); LoadV2ray(); - HttpProxyHandle.RestartHttpAgent(config, true); + } + } + + private void tsbRoutingSetting_Click(object sender, EventArgs e) + { + RoutingSettingForm fm = new RoutingSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); } } @@ -858,13 +845,13 @@ namespace v2rayN.Forms private void menuAddShadowsocksServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Shadowsocks, -1); + ShowServerForm((int)EConfigType.Shadowsocks, -1); ShowForm(); } private void menuAddSocksServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Socks, -1); + ShowServerForm((int)EConfigType.Socks, -1); ShowForm(); } @@ -1020,10 +1007,11 @@ namespace v2rayN.Forms this.ShowInTaskbar = true; //this.notifyIcon1.Visible = false; this.txtMsgBox.ScrollToCaret(); - if (config.index >= 0 && config.index < lvServers.Items.Count) - { - lvServers.EnsureVisible(config.index); // workaround - } + //if (config.index >= 0 && config.index < lvServers.Items.Count) + //{ + // lvServers.Items[config.index].Selected = true; + // lvServers.EnsureVisible(config.index); // workaround + //} SetVisibleCore(true); } @@ -1151,55 +1139,37 @@ namespace v2rayN.Forms #region 系统代理相关 - private void menuCopyPACUrl_Click(object sender, EventArgs e) - { - Utils.SetClipboardData(HttpProxyHandle.GetPacUrl()); - } - private void menuNotEnabledHttp_Click(object sender, EventArgs e) - { - SetListenerType(ListenerType.noHttpProxy); - } private void menuGlobal_Click(object sender, EventArgs e) { - SetListenerType(ListenerType.GlobalHttp); + SetListenerType(ESysProxyType.ForcedChange); } - private void menuGlobalPAC_Click(object sender, EventArgs e) + + private void menuKeepClear_Click(object sender, EventArgs e) { - SetListenerType(ListenerType.GlobalPac); - } - private void menuKeep_Click(object sender, EventArgs e) - { - SetListenerType(ListenerType.HttpOpenAndClear); - } - private void menuKeepPAC_Click(object sender, EventArgs e) - { - SetListenerType(ListenerType.PacOpenAndClear); + SetListenerType(ESysProxyType.ForcedClear); } private void menuKeepNothing_Click(object sender, EventArgs e) { - SetListenerType(ListenerType.HttpOpenOnly); + SetListenerType(ESysProxyType.Unchanged); } - private void menuKeepPACNothing_Click(object sender, EventArgs e) + private void SetListenerType(ESysProxyType type) { - SetListenerType(ListenerType.PacOpenOnly); - } - private void SetListenerType(ListenerType type) - { - config.listenerType = type; + config.sysProxyType = type; ChangePACButtonStatus(type); } - private void ChangePACButtonStatus(ListenerType type) + private void ChangePACButtonStatus(ESysProxyType type) { - if (type != ListenerType.noHttpProxy) - { - HttpProxyHandle.RestartHttpAgent(config, false); - } - else - { - HttpProxyHandle.CloseHttpAgent(config); - } + HttpProxyHandle.UpdateSysProxy(config, false); + //if (type != ListenerType.noHttpProxy) + //{ + // HttpProxyHandle.RestartHttpAgent(config, false); + //} + //else + //{ + // HttpProxyHandle.CloseHttpAgent(config); + //} for (int k = 0; k < menuSysAgentMode.DropDownItems.Count; k++) { @@ -1301,6 +1271,16 @@ namespace v2rayN.Forms } private void tsbCheckUpdateCore_Click(object sender, EventArgs e) + { + CheckUpdateCore("v2fly"); + } + + private void tsbCheckUpdateXrayCore_Click(object sender, EventArgs e) + { + CheckUpdateCore("xray"); + } + + private void CheckUpdateCore(string type) { DownloadHandle downloadHandle = null; if (downloadHandle == null) @@ -1362,53 +1342,7 @@ namespace v2rayN.Forms } AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayCore")); - downloadHandle.CheckUpdateAsync("Core"); - } - - private void tsbCheckUpdatePACList_Click(object sender, EventArgs e) - { - DownloadHandle pacListHandle = null; - if (pacListHandle == null) - { - pacListHandle = new DownloadHandle(); - pacListHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - string result = args.Msg; - if (Utils.IsNullOrEmpty(result)) - { - return; - } - pacListHandle.GenPacFile(result); - - AppendText(false, UIRes.I18N("MsgPACUpdateSuccessfully")); - } - else - { - AppendText(false, UIRes.I18N("MsgPACUpdateFailed")); - } - }; - pacListHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - } - AppendText(false, UIRes.I18N("MsgStartUpdatingPAC")); - pacListHandle.WebDownloadString(config.urlGFWList); - } - - private void tsbCheckClearPACList_Click(object sender, EventArgs e) - { - try - { - File.WriteAllText(Utils.GetPath(Global.pacFILE), Utils.GetEmbedText(Global.BlankPacFileName), Encoding.UTF8); - AppendText(false, UIRes.I18N("MsgSimplifyPAC")); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } + downloadHandle.CheckUpdateAsync(type); } #endregion @@ -1570,8 +1504,8 @@ namespace v2rayN.Forms + #endregion - } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index eb1e2e63..e1d6def6 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -127,17 +127,14 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Magenta - 355, 22 97, 53 - - groupBox2 + + 355, 22 Add [VLESS] server @@ -151,11 +148,8 @@ Restart service - - 184, 6 - - - tsbSubSetting + + menuCopyServer 264, 22 @@ -176,22 +170,25 @@ ImageAboveText + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 语言-[中文简体] NoControl - - Top + + Settings tsbHelp - - 5 - + + 0 + False @@ -213,23 +210,20 @@ 187, 22 + + tsbSetting + toolSslBlank2 - - tsbCheckUpdateN - 355, 22 355, 22 - - Move to top (T) - - - 45, 53 + + tsbCheckUpdateN Only open Http proxy and do nothing @@ -237,11 +231,14 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuExport2SubContent + toolStripSeparator7 - Update v2rayCore + Update v2flyCore Magenta @@ -255,8 +252,8 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuExport2SubContent + + Fill 52, 17 @@ -264,8 +261,14 @@ Share - - tsbQRCodeSwitch + + Subscriptions + + + 952, 351 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 355, 22 @@ -273,23 +276,23 @@ Export selected server for client configuration + + tsbRoutingSetting + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Export selected server for server configuration - - ImageAboveText + + 0, 17 952, 56 @@ -306,21 +309,21 @@ menuTcpingServer - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ImageAboveText System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 356, 600 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 v2rayN - - 411, 22 - 355, 22 @@ -334,25 +337,19 @@ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 393, 22 + 203, 22 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbClose - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 187, 22 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -368,17 +365,17 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM - mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY - FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr - flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh - VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh - 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X + jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY + 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 + NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY + B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - - 411, 22 + + Servers 3 @@ -413,15 +410,15 @@ menuMoveDown + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Import bulk URL from clipboard - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 411, 22 - Move to bottom (B) @@ -434,8 +431,8 @@ 48, 53 - - 393, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 355, 22 @@ -447,7 +444,7 @@ panel1 - 195, 17 + 206, 17 0 @@ -461,17 +458,17 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuKeepClear + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bottom - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Export share URLs to clipboard (Ctrl+C) scMain.Panel2 @@ -510,7 +507,7 @@ tsbAbout - 195, 17 + 206, 17 toolStripSeparator5 @@ -527,6 +524,9 @@ 352, 6 + + tsbPromotion + 256, 331 @@ -539,17 +539,14 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6, 56 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 352, 6 groupBox1 - 195, 17 + 206, 17 2 @@ -557,21 +554,15 @@ 125, 22 - - 0, 17 - scMain.Panel2 - 58, 53 + 161, 22 355, 22 - - Not Enabled Http Proxy - 187, 22 @@ -587,14 +578,17 @@ 686 - - ImageAboveText + + tsbTestMe - 265, 164 + 265, 142 - - 355, 22 + + 411, 22 + + + $this System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -605,9 +599,15 @@ Check for updates - + + tsbCheckUpdateXrayCore + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 17 + toolSslServerSpeed @@ -620,24 +620,18 @@ 125, 22 - - Only open Http proxy and clear the proxy settings - scMain + + 203, 22 + HTTP: Remove selected servers (Delete) - - 411, 22 - - - menuKeepPAC - 0 @@ -647,17 +641,11 @@ menuSelectAll - - $this - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical + + Move to top (T) - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -668,11 +656,11 @@ ImageAboveText - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 1 - - 187, 22 + + Promotion menuAddServers @@ -695,14 +683,17 @@ menuExport2ShareUrl + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + tsMain System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbReload + + SOCKS5: v2rayN (this software) @@ -719,8 +710,8 @@ 0, 66 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 5 tsbV2rayWebsite @@ -752,8 +743,8 @@ Language-[English] - - menuSpeedServer + + tsbSubSetting 264, 22 @@ -761,6 +752,9 @@ 0 + + Fill + toolSslBlank3 @@ -770,11 +764,14 @@ Add [Trojan] server + + 161, 22 + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator11 + + ImageAboveText System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -782,9 +779,6 @@ 0, 417 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 352, 6 @@ -800,20 +794,17 @@ 1 - - toolSslPacPort - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Settings + OptionSetting menuMoveTop - - menuKeep + + tsbCheckUpdateCore @@ -832,12 +823,12 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 952, 351 - menuScanScreen + + ImageAboveText + cmsLv @@ -847,12 +838,15 @@ 6, 56 - - Fill - toolSslBlank1 + + scMain.Panel1 + + + tsbReload + tsbSubUpdate @@ -865,11 +859,8 @@ SPEED Disabled - - PAC: - - - Promotion + + 67, 53 menuSysAgentMode @@ -877,8 +868,8 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0 + + ImageAboveText Export subscription (base64) share to clipboard @@ -907,17 +898,17 @@ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator13 + + tsbClose - - 1 + + RoutingSetting System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 17 + + tsbQRCodeSwitch 3, 151 @@ -928,8 +919,8 @@ 355, 22 - - Subscriptions + + 6, 56 952, 10 @@ -940,15 +931,9 @@ 264, 22 - - menuNotEnabledHttp - 0 - - Informations - toolStripSeparator8 @@ -964,9 +949,6 @@ Test servers ping (Ctrl+P) - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -979,6 +961,15 @@ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top + menuSetDefaultServer @@ -988,11 +979,11 @@ Settings - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 45, 53 - - menuCopyServer + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Http proxy @@ -1000,12 +991,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 411, 22 - - - Only open PAC and clear the proxy settings - 355, 22 @@ -1051,11 +1036,11 @@ 2 - - menuKeepPACNothing + + toolStripSeparator11 - - Check for updated PAC (need the HTTP proxy are ON) + + Magenta 355, 22 @@ -1063,11 +1048,8 @@ v2rayN Project - - Servers - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1075,8 +1057,8 @@ Select All (Ctrl+A) - - ImageAboveText + + Informations 3 @@ -1084,14 +1066,8 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbCheckUpdateCore - - - SOCKS5: - - - 33, 17 + + menuSpeedServer 355, 22 @@ -1099,8 +1075,8 @@ menuRemoveServer - - tsbTestMe + + Test current service status 355, 22 @@ -1120,20 +1096,14 @@ Down (D) - - menuCopyPACUrl - 352, 6 Magenta - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Only open PAC and do nothing + + 411, 22 355, 22 @@ -1156,6 +1126,9 @@ 355, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + groupBox2 @@ -1171,8 +1144,8 @@ 微软雅黑, 8pt - - Export share URLs to clipboard (Ctrl+C) + + Vertical 411, 22 @@ -1189,26 +1162,17 @@ System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Simplify PAC (need to set Core route) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - $this - - Fill + + 0, 0 qrCodeControl - - 264, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 355, 22 @@ -1225,8 +1189,8 @@ 微软雅黑, 8pt - - tsbPromotion + + groupBox2 ImageAboveText @@ -1234,21 +1198,15 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuGlobalPAC - - 393, 22 + 203, 22 - - 356, 600 + + 184, 6 0, 0 - - scMain.Panel1 - Up (U) @@ -1291,9 +1249,6 @@ 946, 22 - - Open PAC and set the system proxy (PAC mode) - 355, 22 @@ -1303,9 +1258,6 @@ menuAddVlessServer - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 946, 331 @@ -1315,23 +1267,14 @@ Add [Shadowsocks] server - - 390, 6 - 微软雅黑, 8pt 952, 593 - - 411, 22 - - - tsbCheckClearPACList - - - Test current service status + + Scan QR code on the screen toolSslSocksPort @@ -1345,9 +1288,6 @@ menuMoveBottom - - 393, 22 - 1 @@ -1372,26 +1312,17 @@ 6, 56 - - 0, 17 - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Magenta 52, 53 - - ImageAboveText - - - toolSslPacPortLab + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -1405,9 +1336,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Scan QR code on the screen - 0, 56 @@ -1429,6 +1357,9 @@ $this + + Update xrayCore + toolStripSeparator2 @@ -1444,9 +1375,6 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 352, 6 - 952, 176 @@ -1456,15 +1384,9 @@ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 - Fill - - Copy local PAC URL - 3, 17 @@ -1473,37 +1395,34 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== 355, 22 - - 微软雅黑, 8pt - 355, 22 System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdatePACList + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 228, 18 + + zh-Hans + True - 108 + 65 137, 17 diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 83e8f530..ab434f47 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -286,6 +286,12 @@ 批量导出订阅内容至剪贴板(多选) + + 73, 53 + + + 服务器 + 301, 600 @@ -306,62 +312,29 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 73, 53 + + 228, 22 - - 服务器 + + 不改变系统代理 - - 196, 164 + + 228, 22 + + + 自动配置系统代理(全局模式) + + + 228, 22 + + + 清除系统代理 195, 22 - Http代理 - - - 316, 22 - - - 关闭Http代理 - - - 316, 22 - - - 开启Http代理,并自动配置系统代理(全局模式) - - - 316, 22 - - - 开启PAC,并自动配置系统代理(PAC模式) - - - 316, 22 - - - 仅开启Http代理,并清除系统代理 - - - 316, 22 - - - 仅开启PAC,并清除系统代理 - - - 316, 22 - - - 仅开启Http代理,不改变系统代理 - - - 316, 22 - - - 仅开启PAC,不改变系统代理 + 系统代理 195, 22 @@ -381,12 +354,6 @@ 扫描屏幕上的二维码 - - 195, 22 - - - 复制本地PAC网址 - 195, 22 @@ -402,20 +369,17 @@ 退出 + + 196, 142 + 服务器列表 - - 信息 - 网速显示未启用 - - 61, 53 - - - 订阅 + + 信息 124, 22 @@ -429,6 +393,12 @@ 更新订阅 + + 61, 53 + + + 订阅 + 52, 53 @@ -436,10 +406,22 @@ 分享 - 76, 53 + 124, 22 - 参数设置 + 参数设置 + + + 124, 22 + + + 路由设置 + + + 61, 53 + + + 设置 @@ -458,38 +440,35 @@ 重启服务 + + 180, 22 + + + v2rayN + + + 180, 22 + + + v2fly-Core + + + 180, 22 + + + xray-Core + 85, 53 检查更新 - - 223, 22 + + v2rayN 项目 - - v2rayN - - - 223, 22 - - - v2rayCore - - - 223, 22 - - - PAC - - - 220, 6 - - - 223, 22 - - - 简化PAC (请设置Core路由) + + V2Ray 官网 69, 53 @@ -497,12 +476,6 @@ 帮助 - - v2rayN 项目 - - - V2Ray 官网 - 68, 53 diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 62af6048..27a61a74 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -34,12 +34,8 @@ this.tabPage1 = new System.Windows.Forms.TabPage(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.chkdefAllowInsecure = new System.Windows.Forms.CheckBox(); - this.label16 = new System.Windows.Forms.Label(); - this.cmblistenerType = new System.Windows.Forms.ComboBox(); this.chksniffingEnabled2 = new System.Windows.Forms.CheckBox(); this.chksniffingEnabled = new System.Windows.Forms.CheckBox(); - this.txtremoteDNS = new System.Windows.Forms.TextBox(); - this.label14 = new System.Windows.Forms.Label(); this.chkmuxEnabled = new System.Windows.Forms.CheckBox(); this.chkAllowIn2 = new System.Windows.Forms.CheckBox(); this.chkudpEnabled2 = new System.Windows.Forms.CheckBox(); @@ -55,21 +51,9 @@ this.txtlocalPort = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.tabPage2 = new System.Windows.Forms.TabPage(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.tabControl2 = new System.Windows.Forms.TabControl(); - this.tabPage3 = new System.Windows.Forms.TabPage(); - this.txtUseragent = new System.Windows.Forms.TextBox(); - this.tabPage4 = new System.Windows.Forms.TabPage(); - this.txtUserdirect = new System.Windows.Forms.TextBox(); - this.tabPage5 = new System.Windows.Forms.TabPage(); - this.txtUserblock = new System.Windows.Forms.TextBox(); - this.tabPage8 = new System.Windows.Forms.TabPage(); - this.cmbroutingMode = new System.Windows.Forms.ComboBox(); - this.panel3 = new System.Windows.Forms.Panel(); - this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); - this.btnSetDefRountingRule = new System.Windows.Forms.Button(); - this.labRoutingTips = new System.Windows.Forms.Label(); - this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); + this.linkDnsObjectDoc = new System.Windows.Forms.LinkLabel(); + this.txtremoteDNS = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); this.tabPage6 = new System.Windows.Forms.TabPage(); this.chkKcpcongestion = new System.Windows.Forms.CheckBox(); this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox(); @@ -90,13 +74,7 @@ this.lbFreshrate = new System.Windows.Forms.Label(); this.chkEnableStatistics = new System.Windows.Forms.CheckBox(); this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); - this.txturlGFWList = new System.Windows.Forms.TextBox(); - this.label13 = new System.Windows.Forms.Label(); this.chkAutoRun = new System.Windows.Forms.CheckBox(); - this.tabPage9 = new System.Windows.Forms.TabPage(); - this.txtuserPacRule = new System.Windows.Forms.TextBox(); - this.panel4 = new System.Windows.Forms.Panel(); - this.label4 = new System.Windows.Forms.Label(); this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); @@ -104,56 +82,41 @@ this.tabPage1.SuspendLayout(); this.groupBox1.SuspendLayout(); this.tabPage2.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.tabControl2.SuspendLayout(); - this.tabPage3.SuspendLayout(); - this.tabPage4.SuspendLayout(); - this.tabPage5.SuspendLayout(); - this.tabPage8.SuspendLayout(); - this.panel3.SuspendLayout(); this.tabPage6.SuspendLayout(); this.tabPage7.SuspendLayout(); - this.tabPage9.SuspendLayout(); - this.panel4.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); // // btnClose // - resources.ApplyResources(this.btnClose, "btnClose"); this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); this.btnClose.Name = "btnClose"; this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // // tabControl1 // - resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Controls.Add(this.tabPage1); this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Controls.Add(this.tabPage6); this.tabControl1.Controls.Add(this.tabPage7); - this.tabControl1.Controls.Add(this.tabPage9); + resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // // tabPage1 // - resources.ApplyResources(this.tabPage1, "tabPage1"); this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); this.tabPage1.Name = "tabPage1"; this.tabPage1.UseVisualStyleBackColor = true; // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.chkdefAllowInsecure); - this.groupBox1.Controls.Add(this.label16); - this.groupBox1.Controls.Add(this.cmblistenerType); this.groupBox1.Controls.Add(this.chksniffingEnabled2); this.groupBox1.Controls.Add(this.chksniffingEnabled); - this.groupBox1.Controls.Add(this.txtremoteDNS); - this.groupBox1.Controls.Add(this.label14); this.groupBox1.Controls.Add(this.chkmuxEnabled); this.groupBox1.Controls.Add(this.chkAllowIn2); this.groupBox1.Controls.Add(this.chkudpEnabled2); @@ -168,6 +131,7 @@ this.groupBox1.Controls.Add(this.label5); this.groupBox1.Controls.Add(this.txtlocalPort); this.groupBox1.Controls.Add(this.label2); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -177,26 +141,6 @@ this.chkdefAllowInsecure.Name = "chkdefAllowInsecure"; this.chkdefAllowInsecure.UseVisualStyleBackColor = true; // - // label16 - // - resources.ApplyResources(this.label16, "label16"); - this.label16.Name = "label16"; - // - // cmblistenerType - // - resources.ApplyResources(this.cmblistenerType, "cmblistenerType"); - this.cmblistenerType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmblistenerType.FormattingEnabled = true; - this.cmblistenerType.Items.AddRange(new object[] { - resources.GetString("cmblistenerType.Items"), - resources.GetString("cmblistenerType.Items1"), - resources.GetString("cmblistenerType.Items2"), - resources.GetString("cmblistenerType.Items3"), - resources.GetString("cmblistenerType.Items4"), - resources.GetString("cmblistenerType.Items5"), - resources.GetString("cmblistenerType.Items6")}); - this.cmblistenerType.Name = "cmblistenerType"; - // // chksniffingEnabled2 // resources.ApplyResources(this.chksniffingEnabled2, "chksniffingEnabled2"); @@ -209,16 +153,6 @@ this.chksniffingEnabled.Name = "chksniffingEnabled"; this.chksniffingEnabled.UseVisualStyleBackColor = true; // - // txtremoteDNS - // - resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS"); - this.txtremoteDNS.Name = "txtremoteDNS"; - // - // label14 - // - resources.ApplyResources(this.label14, "label14"); - this.label14.Name = "label14"; - // // chkmuxEnabled // resources.ApplyResources(this.chkmuxEnabled, "chkmuxEnabled"); @@ -240,12 +174,12 @@ // // cmbprotocol2 // - resources.ApplyResources(this.cmbprotocol2, "cmbprotocol2"); this.cmbprotocol2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbprotocol2.FormattingEnabled = true; this.cmbprotocol2.Items.AddRange(new object[] { resources.GetString("cmbprotocol2.Items"), resources.GetString("cmbprotocol2.Items1")}); + resources.ApplyResources(this.cmbprotocol2, "cmbprotocol2"); this.cmbprotocol2.Name = "cmbprotocol2"; // // label3 @@ -260,8 +194,8 @@ // // cmbprotocol // - resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); this.cmbprotocol.FormattingEnabled = true; this.cmbprotocol.Items.AddRange(new object[] { resources.GetString("cmbprotocol.Items"), @@ -287,7 +221,6 @@ // // cmbloglevel // - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbloglevel.FormattingEnabled = true; this.cmbloglevel.Items.AddRange(new object[] { @@ -296,6 +229,7 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -315,127 +249,31 @@ // // tabPage2 // + this.tabPage2.Controls.Add(this.linkDnsObjectDoc); + this.tabPage2.Controls.Add(this.txtremoteDNS); + this.tabPage2.Controls.Add(this.label14); resources.ApplyResources(this.tabPage2, "tabPage2"); - this.tabPage2.Controls.Add(this.groupBox2); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // - // groupBox2 + // linkDnsObjectDoc // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.tabControl2); - this.groupBox2.Controls.Add(this.panel3); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; + resources.ApplyResources(this.linkDnsObjectDoc, "linkDnsObjectDoc"); + this.linkDnsObjectDoc.Name = "linkDnsObjectDoc"; + this.linkDnsObjectDoc.TabStop = true; // - // tabControl2 + // txtremoteDNS // - resources.ApplyResources(this.tabControl2, "tabControl2"); - this.tabControl2.Controls.Add(this.tabPage3); - this.tabControl2.Controls.Add(this.tabPage4); - this.tabControl2.Controls.Add(this.tabPage5); - this.tabControl2.Controls.Add(this.tabPage8); - this.tabControl2.Name = "tabControl2"; - this.tabControl2.SelectedIndex = 0; + resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS"); + this.txtremoteDNS.Name = "txtremoteDNS"; // - // tabPage3 + // label14 // - resources.ApplyResources(this.tabPage3, "tabPage3"); - this.tabPage3.Controls.Add(this.txtUseragent); - this.tabPage3.Name = "tabPage3"; - this.tabPage3.UseVisualStyleBackColor = true; - // - // txtUseragent - // - resources.ApplyResources(this.txtUseragent, "txtUseragent"); - this.txtUseragent.Name = "txtUseragent"; - // - // tabPage4 - // - resources.ApplyResources(this.tabPage4, "tabPage4"); - this.tabPage4.Controls.Add(this.txtUserdirect); - this.tabPage4.Name = "tabPage4"; - this.tabPage4.UseVisualStyleBackColor = true; - // - // txtUserdirect - // - resources.ApplyResources(this.txtUserdirect, "txtUserdirect"); - this.txtUserdirect.Name = "txtUserdirect"; - // - // tabPage5 - // - resources.ApplyResources(this.tabPage5, "tabPage5"); - this.tabPage5.Controls.Add(this.txtUserblock); - this.tabPage5.Name = "tabPage5"; - this.tabPage5.UseVisualStyleBackColor = true; - // - // txtUserblock - // - resources.ApplyResources(this.txtUserblock, "txtUserblock"); - this.txtUserblock.Name = "txtUserblock"; - // - // tabPage8 - // - resources.ApplyResources(this.tabPage8, "tabPage8"); - this.tabPage8.Controls.Add(this.cmbroutingMode); - this.tabPage8.Name = "tabPage8"; - this.tabPage8.UseVisualStyleBackColor = true; - // - // cmbroutingMode - // - resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); - this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbroutingMode.FormattingEnabled = true; - this.cmbroutingMode.Items.AddRange(new object[] { - resources.GetString("cmbroutingMode.Items"), - resources.GetString("cmbroutingMode.Items1"), - resources.GetString("cmbroutingMode.Items2"), - resources.GetString("cmbroutingMode.Items3")}); - this.cmbroutingMode.Name = "cmbroutingMode"; - // - // panel3 - // - resources.ApplyResources(this.panel3, "panel3"); - this.panel3.Controls.Add(this.linkLabelRoutingDoc); - this.panel3.Controls.Add(this.btnSetDefRountingRule); - this.panel3.Controls.Add(this.labRoutingTips); - this.panel3.Controls.Add(this.cmbdomainStrategy); - this.panel3.Name = "panel3"; - // - // linkLabelRoutingDoc - // - resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc"); - this.linkLabelRoutingDoc.Name = "linkLabelRoutingDoc"; - this.linkLabelRoutingDoc.TabStop = true; - this.linkLabelRoutingDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelRoutingDoc_LinkClicked); - // - // btnSetDefRountingRule - // - resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule"); - this.btnSetDefRountingRule.Name = "btnSetDefRountingRule"; - this.btnSetDefRountingRule.UseVisualStyleBackColor = true; - this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click); - // - // labRoutingTips - // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; - this.labRoutingTips.Name = "labRoutingTips"; - // - // cmbdomainStrategy - // - resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); - this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbdomainStrategy.FormattingEnabled = true; - this.cmbdomainStrategy.Items.AddRange(new object[] { - resources.GetString("cmbdomainStrategy.Items"), - resources.GetString("cmbdomainStrategy.Items1"), - resources.GetString("cmbdomainStrategy.Items2")}); - this.cmbdomainStrategy.Name = "cmbdomainStrategy"; + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; // // tabPage6 // - resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -449,6 +287,7 @@ this.tabPage6.Controls.Add(this.label7); this.tabPage6.Controls.Add(this.txtKcpmtu); this.tabPage6.Controls.Add(this.label6); + resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Name = "tabPage6"; this.tabPage6.UseVisualStyleBackColor = true; // @@ -520,15 +359,13 @@ // // tabPage7 // - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); this.tabPage7.Controls.Add(this.cbFreshrate); this.tabPage7.Controls.Add(this.lbFreshrate); this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabPage7.Controls.Add(this.chkAllowLANConn); - this.tabPage7.Controls.Add(this.txturlGFWList); - this.tabPage7.Controls.Add(this.label13); this.tabPage7.Controls.Add(this.chkAutoRun); + resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // @@ -540,9 +377,9 @@ // // cbFreshrate // - resources.ApplyResources(this.cbFreshrate, "cbFreshrate"); this.cbFreshrate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cbFreshrate.FormattingEnabled = true; + resources.ApplyResources(this.cbFreshrate, "cbFreshrate"); this.cbFreshrate.Name = "cbFreshrate"; // // lbFreshrate @@ -562,52 +399,17 @@ this.chkAllowLANConn.Name = "chkAllowLANConn"; this.chkAllowLANConn.UseVisualStyleBackColor = true; // - // txturlGFWList - // - resources.ApplyResources(this.txturlGFWList, "txturlGFWList"); - this.txturlGFWList.Name = "txturlGFWList"; - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // // chkAutoRun // resources.ApplyResources(this.chkAutoRun, "chkAutoRun"); this.chkAutoRun.Name = "chkAutoRun"; this.chkAutoRun.UseVisualStyleBackColor = true; // - // tabPage9 - // - resources.ApplyResources(this.tabPage9, "tabPage9"); - this.tabPage9.Controls.Add(this.txtuserPacRule); - this.tabPage9.Controls.Add(this.panel4); - this.tabPage9.Name = "tabPage9"; - this.tabPage9.UseVisualStyleBackColor = true; - // - // txtuserPacRule - // - resources.ApplyResources(this.txtuserPacRule, "txtuserPacRule"); - this.txtuserPacRule.Name = "txtuserPacRule"; - // - // panel4 - // - resources.ApplyResources(this.panel4, "panel4"); - this.panel4.Controls.Add(this.label4); - this.panel4.Name = "panel4"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.ForeColor = System.Drawing.Color.Brown; - this.label4.Name = "label4"; - // // panel2 // - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // btnOK @@ -638,24 +440,11 @@ this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.tabPage2.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.tabControl2.ResumeLayout(false); - this.tabPage3.ResumeLayout(false); - this.tabPage3.PerformLayout(); - this.tabPage4.ResumeLayout(false); - this.tabPage4.PerformLayout(); - this.tabPage5.ResumeLayout(false); - this.tabPage5.PerformLayout(); - this.tabPage8.ResumeLayout(false); - this.panel3.ResumeLayout(false); - this.panel3.PerformLayout(); + this.tabPage2.PerformLayout(); this.tabPage6.ResumeLayout(false); this.tabPage6.PerformLayout(); this.tabPage7.ResumeLayout(false); this.tabPage7.PerformLayout(); - this.tabPage9.ResumeLayout(false); - this.tabPage9.PerformLayout(); - this.panel4.ResumeLayout(false); this.panel2.ResumeLayout(false); this.ResumeLayout(false); @@ -675,9 +464,7 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TabControl tabControl1; private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.ComboBox cmbprotocol; private System.Windows.Forms.Label label1; private System.Windows.Forms.ComboBox cmbprotocol2; @@ -686,14 +473,6 @@ private System.Windows.Forms.CheckBox chkudpEnabled2; private System.Windows.Forms.CheckBox chkAllowIn2; private System.Windows.Forms.CheckBox chkmuxEnabled; - private System.Windows.Forms.TabControl tabControl2; - private System.Windows.Forms.TabPage tabPage3; - private System.Windows.Forms.TabPage tabPage4; - private System.Windows.Forms.Label labRoutingTips; - private System.Windows.Forms.TextBox txtUseragent; - private System.Windows.Forms.TabPage tabPage5; - private System.Windows.Forms.TextBox txtUserdirect; - private System.Windows.Forms.TextBox txtUserblock; private System.Windows.Forms.TabPage tabPage6; private System.Windows.Forms.TextBox txtKcpmtu; private System.Windows.Forms.Label label6; @@ -710,29 +489,17 @@ private System.Windows.Forms.CheckBox chkKcpcongestion; private System.Windows.Forms.TabPage tabPage7; private System.Windows.Forms.CheckBox chkAutoRun; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.TextBox txturlGFWList; private System.Windows.Forms.CheckBox chkAllowLANConn; - private System.Windows.Forms.TextBox txtremoteDNS; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.ComboBox cmbdomainStrategy; - private System.Windows.Forms.ComboBox cmbroutingMode; private System.Windows.Forms.CheckBox chksniffingEnabled; private System.Windows.Forms.CheckBox chksniffingEnabled2; - private System.Windows.Forms.Button btnSetDefRountingRule; private System.Windows.Forms.CheckBox chkEnableStatistics; private System.Windows.Forms.ComboBox cbFreshrate; private System.Windows.Forms.Label lbFreshrate; - private System.Windows.Forms.Label label16; - private System.Windows.Forms.ComboBox cmblistenerType; - private System.Windows.Forms.TabPage tabPage8; - private System.Windows.Forms.TabPage tabPage9; - private System.Windows.Forms.TextBox txtuserPacRule; - private System.Windows.Forms.Panel panel4; - private System.Windows.Forms.Label label4; private System.Windows.Forms.CheckBox chkKeepOlderDedupl; - private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; private System.Windows.Forms.CheckBox chkdefAllowInsecure; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.LinkLabel linkDnsObjectDoc; + private System.Windows.Forms.TextBox txtremoteDNS; + private System.Windows.Forms.Label label14; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 78d4eeff..d1262268 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -4,6 +4,7 @@ using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Base; using v2rayN.HttpProxyHandler; +using v2rayN.Mode; namespace v2rayN.Forms { @@ -18,13 +19,9 @@ namespace v2rayN.Forms { InitBase(); - InitRouting(); - InitKCP(); InitGUI(); - - InitUserPAC(); } /// @@ -68,25 +65,10 @@ namespace v2rayN.Forms //remoteDNS txtremoteDNS.Text = config.remoteDNS; - cmblistenerType.SelectedIndex = (int)config.listenerType; chkdefAllowInsecure.Checked = config.defAllowInsecure; } - /// - /// 初始化路由设置 - /// - private void InitRouting() - { - //路由 - cmbdomainStrategy.Text = config.domainStrategy; - int.TryParse(config.routingMode, out int routingMode); - cmbroutingMode.SelectedIndex = routingMode; - - txtUseragent.Text = Utils.List2String(config.useragent, true); - txtUserdirect.Text = Utils.List2String(config.userdirect, true); - txtUserblock.Text = Utils.List2String(config.userblock, true); - } /// /// 初始化KCP设置 @@ -110,16 +92,10 @@ namespace v2rayN.Forms //开机自动启动 chkAutoRun.Checked = Utils.IsAutoRun(); - //自定义GFWList - txturlGFWList.Text = config.urlGFWList; - chkAllowLANConn.Checked = config.allowLANConn; chkEnableStatistics.Checked = config.enableStatistics; chkKeepOlderDedupl.Checked = config.keepOlderDedupl; - - - ComboItem[] cbSource = new ComboItem[] { new ComboItem{ID = (int)Global.StatisticsFreshRate.quick, Text = UIRes.I18N("QuickFresh")}, @@ -145,12 +121,6 @@ namespace v2rayN.Forms } } - - private void InitUserPAC() - { - txtuserPacRule.Text = Utils.List2String(config.userPacRule, true); - } - private void btnOK_Click(object sender, EventArgs e) { if (SaveBase() != 0) @@ -158,10 +128,6 @@ namespace v2rayN.Forms return; } - if (SaveRouting() != 0) - { - return; - } if (SaveKCP() != 0) { @@ -173,11 +139,6 @@ namespace v2rayN.Forms return; } - if (SaveUserPAC() != 0) - { - return; - } - if (ConfigHandler.SaveConfig(ref config) == 0) { this.DialogResult = DialogResult.OK; @@ -265,36 +226,12 @@ namespace v2rayN.Forms //remoteDNS config.remoteDNS = txtremoteDNS.Text.TrimEx(); - config.listenerType = (ListenerType)Enum.ToObject(typeof(ListenerType), cmblistenerType.SelectedIndex); config.defAllowInsecure = chkdefAllowInsecure.Checked; return 0; } - /// - /// 保存路由设置 - /// - /// - private int SaveRouting() - { - //路由 - string domainStrategy = cmbdomainStrategy.Text; - string routingMode = cmbroutingMode.SelectedIndex.ToString(); - - string useragent = txtUseragent.Text.TrimEx(); - string userdirect = txtUserdirect.Text.TrimEx(); - string userblock = txtUserblock.Text.TrimEx(); - - config.domainStrategy = domainStrategy; - config.routingMode = routingMode; - - config.useragent = Utils.String2List(useragent); - config.userdirect = Utils.String2List(userdirect); - config.userblock = Utils.String2List(userblock); - - return 0; - } /// /// 保存KCP设置 @@ -340,9 +277,6 @@ namespace v2rayN.Forms //开机自动启动 Utils.SetAutoRun(chkAutoRun.Checked); - //自定义GFWList - config.urlGFWList = txturlGFWList.Text.TrimEx(); - config.allowLANConn = chkAllowLANConn.Checked; bool lastEnableStatistics = config.enableStatistics; @@ -350,27 +284,10 @@ namespace v2rayN.Forms config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; config.keepOlderDedupl = chkKeepOlderDedupl.Checked; - //if(lastEnableStatistics != config.enableStatistics) - //{ - // /// https://stackoverflow.com/questions/779405/how-do-i-restart-my-c-sharp-winform-application - // // Shut down the current app instance. - // Application.Exit(); - - // // Restart the app passing "/restart [processId]" as cmd line args - // Process.Start(Application.ExecutablePath, "/restart " + Process.GetCurrentProcess().Id); - //} - return 0; - } - - private int SaveUserPAC() - { - string userPacRule = txtuserPacRule.Text.TrimEx(); - userPacRule = userPacRule.Replace("\"", ""); - - config.userPacRule = Utils.String2List(userPacRule); return 0; } + private void btnClose_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; @@ -388,75 +305,9 @@ namespace v2rayN.Forms chkudpEnabled2.Enabled = blAllow2; } - private void btnSetDefRountingRule_Click(object sender, EventArgs e) + private void linkDnsObjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - txtUseragent.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.agentTag); - txtUserdirect.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.directTag); - txtUserblock.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.blockTag); - cmbroutingMode.SelectedIndex = 3; - - List lstUrl = new List - { - Global.CustomRoutingListUrl + Global.agentTag, - Global.CustomRoutingListUrl + Global.directTag, - Global.CustomRoutingListUrl + Global.blockTag - }; - - List lstTxt = new List - { - txtUseragent, - txtUserdirect, - txtUserblock - }; - - for (int k = 0; k < lstUrl.Count; k++) - { - TextBox txt = lstTxt[k]; - DownloadHandle downloadHandle = new DownloadHandle(); - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - string result = args.Msg; - if (Utils.IsNullOrEmpty(result)) - { - return; - } - txt.Text = result; - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - - downloadHandle.WebDownloadString(lstUrl[k]); - } - } - void AppendText(bool notify, string text) - { - labRoutingTips.Text = text; - } - - private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); - } - } - - class ComboItem - { - public int ID - { - get; set; - } - public string Text - { - get; set; + System.Diagnostics.Process.Start("https://www.v2fly.org/config/dns.html#dnsobject"); } } } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 2d85641a..f0757e7d 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,34 +117,992 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 16 + + + 75, 23 + + + 7 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + True + + + + NoControl + + + 15, 192 + + + 102, 16 + + + 35 + + + allowInsecure + + + chkdefAllowInsecure + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + NoControl + + + 468, 60 + + + 120, 16 + + + 32 + + + Turn on Sniffing + + + False + + + chksniffingEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True + + + NoControl + + + 468, 27 + + + 120, 16 + + + 31 + + + Turn on Sniffing + + + chksniffingEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 15, 129 + + + 174, 16 + + + 20 + + + Turn on Mux Multiplexing + + + chkmuxEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + True - + + 15, 63 + + + 120, 16 + + + 19 + + + listening port 2 + + + False + + + chkAllowIn2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + True + + + 369, 62 + + + 84, 16 + + + 18 + + + Enable UDP + + + False + + + chkudpEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + socks + + + http + + + 257, 60 + + + 97, 20 + + + 17 + + + False + + + cmbprotocol2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + True + + + 206, 64 + + + 53, 12 + + + 16 + + + protocol + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + 124, 60 + + + 78, 21 + + + 14 + + + False + + + txtlocalPort2 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox1 + + + 8 + + + False + + + socks + + + http + + + 257, 25 + + + 97, 20 + + + 12 + + + cmbprotocol + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + True + + + 206, 29 + + + 53, 12 + + 11 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + protocol - - groupBox2 + + label1 - - 2 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 30, 176 + + groupBox1 + + + 10 + + + True + + + 369, 27 + + + 84, 16 + + + 10 + + + Enable UDP + + + chkudpEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + True + + + 15, 160 + + + 126, 16 + + + 9 Record local logs - - 634, 460 + + chklogEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + debug + + + info + + + warning + + + error + + + none + + + 257, 158 + + + 97, 20 + + + 6 + + + cmbloglevel + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + True + + + 193, 162 + + + 59, 12 + + + 8 + + + Log level + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + 124, 25 + + + 78, 21 + + + 3 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + True + + + 33, 29 + + + 89, 12 + + + 2 + + + Listening port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 16 + + + Fill + + + 3, 3 + + + 648, 421 + + + 6 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 654, 427 + + + 0 + + + Core: basic settings + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + True + + + NoControl + + + 342, 17 + + + 0, 0, 0, 0 + + + 107, 12 + + + 40 + + + Support DnsObject + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 8, 41 + + + True + + + 638, 356 + + + 39 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 1 + + + True + + + NoControl + + + 8, 17 + + + 281, 12 + + + 38 + + + Custom DNS (multiple, separated by commas (,)) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 2 + + + 4, 22 + + + 654, 427 + + + 4 + + + Core: DNS settings + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + True + + + 20, 143 + + + 84, 16 + + + 20 + + + congestion + + + chkKcpcongestion + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 0 + + + 345, 100 + + + 94, 21 + + + 15 + + + txtKcpwriteBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 1 + + + True + + + 236, 104 + + + 95, 12 + + + 14 + + + writeBufferSize + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 2 + + + 111, 100 + + + 94, 21 + + + 13 + + + txtKcpreadBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 3 + + + True + + + 18, 104 + + + 89, 12 + + + 12 + + + readBufferSize + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 4 + + + 345, 62 + + + 94, 21 + + + 11 + + + txtKcpdownlinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 5 + + + True + + + 236, 66 + + + 101, 12 + + + 10 + + + downlinkCapacity + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 6 + + + 111, 62 + + + 94, 21 + + + 9 + + + txtKcpuplinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 7 + + + True + + + 18, 66 + + + 89, 12 + + + 8 + + + uplinkCapacity + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 8 + + + 345, 24 + + + 94, 21 + + + 7 + + + txtKcptti + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 9 + + + True + + + 236, 28 + + + 23, 12 + + + 6 + + + tti + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 10 + + + 111, 24 + + + 94, 21 + + + 5 + + + txtKcpmtu + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 11 + + + True + + + 18, 28 + + + 23, 12 + + + 4 + + + mtu + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 12 @@ -152,1922 +1110,340 @@ 4, 22 - - txtKcpwriteBufferSize - - - txtuserPacRule - - - 2 - - - False - - - 18 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - groupBox1 - - - 5 - - - 94, 21 - - - 9 - - - groupBox1 - - - tabPage9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - linkLabelRoutingDoc - - - 468, 60 - - - - Top - - - 102, 16 - - - 6 - - - txtKcptti - - - tabPage3 - - - 4, 22 - - - cmblistenerType - - - 0 - - - 634, 460 - - - 0 - - - 111, 100 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3 - - - 598, 16 - - - Core: basic settings - - - True - - - 120, 16 - - - 281, 12 - - - panel3 - - - True - - - tti - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 84, 16 - - - groupBox1 - - - 65, 12 - - - 628, 454 - - - tabPage7 - - - Only open PAC, do not automatically configure PAC - - - 12 - - - 662, 60 - - - 20 - - - http - - - 7 - - - chkdefAllowInsecure - - - 648, 573 - - - 206, 64 - - - 95, 12 - - - tabPage6 - - - 14 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 63 - - - tabControl2 - - - 16 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - Enable UDP - - - 94, 21 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - &Cancel - - - label10 - - - 648, 573 - - - Vertical - - - groupBox1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 1 - - - Bypassing the LAN address - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bypassing LAN and mainland address - - - Bypass mainland address - - - Top - - - 12 - - - txtKcpmtu - - - lbFreshrate - - - 1 - - - label11 - - - 29 - - - 1 - - - NoControl - - - Turn on Sniffing - - - Only open Http proxy, do not automatically configure proxy server (direct mode) - - - False - - - 4 - - - tabPage6 - - - False - - - tabControl2 - - - 1 - - - $this - - - 7 - - - 3 - - - 4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - readBufferSize - - - 0 - - - tabPage6 - - - 3 - - - True - - - 18 - - - True - - - Fill - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - congestion - - - NoControl - - - groupBox1 - - - panel3 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 3, 3, 3, 3 - - 89, 12 - - - info - - - txtUseragent - - - 1 - - - tabPage7 - - - v2rayN settings - - - 20 - - - groupBox1 - - - 16 - - - Not Enabled Http Proxy - - - 14 - - - 32 - - - 628, 454 - - - 6, 12 - - - groupBox1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtKcpdownlinkCapacity - - - 198, 16 - - - Automatically start at system startup - - - 3, 3, 3, 3 - - - 1 - - - Http proxy - - - 4 - - - groupBox1 - - - tabPage6 - - - 355, 16 - - - 3, 3, 3, 3 - - - 97, 20 - - - 3 - - - 662, 605 - - - 33, 29 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 78, 21 - - - 5, 45 - - - Custom DNS (multiple, separated by commas (,)) - - - tabControl1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 598, 16 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - warning - - - groupBox1 - - - 0 - - - tabPage7 - - - Statistics freshrate - - - label5 - - - 120, 16 - - - 20 - - - 89, 12 - - - Only open Http proxy and do nothing - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 18, 66 - - - 20, 143 - - - 11 - - - 4, 4, 4, 4 - - - tabPage6 - - - btnClose - - - Turn on Sniffing - - - groupBox1 - - - 18, 28 - - - 30 - - - 34 - - - 20 - - - 29 - - - 0 - - - 21, 17 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 14 - - - 19 - - - 4, 22 - - - *Set user pac rules, separated by commas (,) - - - True - - - chksniffingEnabled - - - 6 - - - 174, 16 - - - 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 18, 104 - - - tabPage2 - - - NoControl - - - 97, 20 - - - socks - - - tabPage5 - - - 576, 16 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 464, 20 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage9 - - - True - - - tabPage6 - - - *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP - - - tabPage3 - - - 30 - - - 53, 12 - - - 17 - - - label8 - - - 468, 27 - - - label13 - - - chkAutoRun - - - tabControl2 - - - 654, 579 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 345, 62 - - - 15 - - - 12 - - - 1 - - - chkudpEnabled - - - True - - - 33, 253 - - - tabPage1 - - - 5 - - - tabPage6 - - - 2 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - btnSetDefRountingRule - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 32 - - - label1 - - - 84, 16 - - - tabPage8 - - - True - - - panel4 - - - label7 - - - allowInsecure - - - txtlocalPort - - - True - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3, 17 - - - 3, 40 - - - labRoutingTips - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - 124, 25 - - - protocol - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - Top, Right - - - Turn on Mux Multiplexing - - - True - - - 23, 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 555, 100 - - - socks - - - 0 - - - 3, 3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - chkAllowLANConn - - - 84, 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - tabControl1 - - - True - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 38 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - 10 - - - 369, 62 - - - 13 - - - 1.Proxy Domain or IP - - - groupBox1 - - - panel3 - - - NoControl - - - 654, 579 - - - chkEnableStatistics - - - 14 - - - 8 - - - 7 - - - http - - - 53, 12 - - - 193, 162 - - - True - - - 2 - - - 0 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - label2 - - - 165, 20 - - - False - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 3, 3 - - - 9 - - - groupBox1 - - - 4.Pre-defined rules - - - 101, 12 - - - 3 - - - 12 - - - 431, 12 - - - Domain strategy - - - cmbprotocol - - - 648, 37 - - - True - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - Listening port - - - Vertical - - - Fill - - - 1 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - 1 - - - 28 - - - 257, 60 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 94, 21 - - - True - - - cmbprotocol2 - - - Open Http proxy and automatically configure proxy server (global mode) - - - groupBox2 - - - chkKeepOlderDedupl - - - 15, 129 - - - 255, 20 - - - mtu - - - True - - - True - - - True - - - chkKcpcongestion - - - 1 - - - 0 - - - 257, 25 - - - 3, 84 - - - groupBox1 - - - Top - - - listening port 2 - - - 97, 20 - - - chkAllowIn2 - - - tabPage2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - True - - - False - - - 3 - - - 33 - - - 4, 22 - - - 9 - - - 541, 100 - - - Core: KCP settings - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - error - - - 15, 160 - - - True - - - 59, 12 - - - 5, 14 - - - groupBox1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 634, 460 - - - 12 - - - 120, 16 - - - 662, 10 - - - txtlocalPort2 - - - Only open PAC and do nothing - - - True - - - Fill - - - groupBox1 - - - 654, 579 - - - 7 - - - 27 - - - 10 - - - False - - - Vertical - - - 206, 29 - - - 8 - - - txtUserdirect - - - chkudpEnabled2 - - - 0 - - - 0 - - - 648, 536 - - - Allow connections from the LAN - - - 161, 84 - - - panel3 - - - 0 - - - tabPage6 - - - tabControl2 - - - 30, 87 - - - txtKcpreadBufferSize - - - 4 - - - panel2 - - - 3 - - - 8 - - - 35 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - User PAC settings - - - 95, 12 - - - tabPage7 - - - 10 - - - none - - - Log level - - - tabControl1 - - - protocol - - - 6 - - - tabPage4 - - - NoControl + + 654, 427 2 - - AsIs - - - 15, 62 - - - 7 - - - tabPage7 - - - 642, 486 - - - 4, 22 - - - 58, 20 - - - groupBox1 - - - 1 - - - 42, 98 - - - 13 - - - 13 - - - 2 - - - downlinkCapacity - - - True - - - 78, 21 - - - tabPage7 - - - True - - - 19 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - cmbroutingMode - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - 23, 12 - - - True - - - 8 - - - True - - - 3, 3, 3, 3 - - - Custom GFWList address (please fill in the blank without customization) - - - 345, 100 - - - panel3 - - - 75, 23 - - - 654, 579 - - - 10 - - - 204, 16 - - - 17 - - - 628, 454 - - - debug - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - - - 1 - - - txtUserblock - - - 229, 23 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage1 - - - 15 - - - 2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 11 - - - 18 - - - 126, 16 - - - 345, 24 - - - NoControl - - - 4, 22 - - - cmbdomainStrategy - - - False - - - 257, 158 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &OK - - - 10 - - - 634, 460 - - - panel2 - - - txtKcpuplinkCapacity - - - 115, 10 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage4 - - - chklogEnabled - - - chksniffingEnabled2 - - - tabPage7 - - - 642, 67 - - - 0 - - - 4, 22 - - - True - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage5 - - - 9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - IPIfNonMatch - - - groupBox1 - - - 4, 22 - - - 23 - - - 3.Block Domain or IP - - - label3 - - - 6 - - - 236, 66 - - - tabPage7 - - - $this - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - $this - - - 8 - - - txtremoteDNS - - - 3, 3 - - - 0, 615 - - - 19 - - - 33 - - - 94, 21 - - - 4, 22 - - - writeBufferSize - - - 11 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 89, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 31 - - - 369, 27 - - - 4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill + + Core: KCP settings tabPage6 - - groupBox1 - - - groupBox1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - True - - - 29 - - - Fill - - - True - - - 3, 3 - - - OptionSettingForm - - - 124, 94 - - - Core: Routing settings - - - 13 - - - tabPage8 - - - 2 - - - 236, 104 - - - 5 - - - Open PAC and automatically configure PAC (PAC mode) - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - tabPage9 - - - 94, 21 - - - 75, 23 - - - 15, 16 - - - 33, 277 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0, 0, 0 - - - 662, 675 - - - uplinkCapacity - - - IPOnDemand - - - NoControl - - - True - - - 6 - - - 1 - - - 0 - - - Settings - - - 0 - - - 3, 3, 3, 3 - - - 3, 3 - - - 32, 205 - - - cmbloglevel - - - 111, 62 - - + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - label4 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - label16 - - - btnOK - - - Set default custom routing rules - - - tabPage6 - - - txturlGFWList - - - chkmuxEnabled - - - 654, 579 - - - tabPage6 - - + tabControl1 - - 0 + + 2 + + + True + + + NoControl 15, 110 - - 5, 11 + + 198, 16 - - 0 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0 - - - Enable UDP - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - groupBox1 - - - 19 - - - 2.Direct Domain or IP - - - 267, 16 - - - Global - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9 - - - 0 - - - 322, 10 - - - 15, 192 - - - 0 - - - 94, 21 - - - 3 + + 33 Keep older when deduplication - - 3, 3, 3, 3 + + chkKeepOlderDedupl - - 236, 28 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Bottom + + tabPage7 - - 3 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 0 - - groupBox1 + + 161, 84 - - 125, 12 + + 58, 20 - - 3, 3, 3, 3 - - - 11 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 124, 60 + + 32 cbFreshrate + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + True + + + NoControl + + + 30, 87 + + + 125, 12 + + + 30 + + + Statistics freshrate + + + lbFreshrate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + True + + + NoControl + + + 15, 62 + + + 576, 16 + + + 29 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + + chkEnableStatistics + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + True + + + 15, 38 + + + 204, 16 + + + 29 + + + Allow connections from the LAN + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 4 + + + True + + + 15, 16 + 246, 16 - - tabPage6 + + 23 - - label6 + + Automatically start at system startup - - 111, 24 + + chkAutoRun - - panel2 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 21 + + tabPage7 - - label9 + + 5 + + + 4, 22 + + + 3, 3, 3, 3 + + + 654, 427 + + + 3 + + + v2rayN settings + + + tabPage7 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 3 + + + Fill 0, 10 + + 662, 453 + + + 10 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 267, 16 + + + 75, 23 + + + 8 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 463 + + + 662, 60 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 0 + + + 662, 10 + + + 9 + panel1 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + 2 - - label14 - True + + zh-Hans + + + 6, 12 + + + 662, 523 + + + 4, 4, 4, 4 + + + Settings + + + OptionSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 81c0d92c..0618fb5f 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -120,43 +120,19 @@ 取消(&C) - - Core:基础设置 - + + 161, 12 + + + 支持填写DnsObject,JSON格式 + - 222, 16 + 336, 16 底层传输安全选tls时,默认跳过证书验证(allowInsecure) - - 53, 12 - - - Http代理 - - - 关闭Http代理 - - - 开启Http代理,并自动配置系统代理(全局模式) - - - 开启PAC,并自动配置系统代理(PAC模式) - - - 仅开启Http代理,并清除系统代理 - - - 仅开启PAC,并清除系统代理 - - - 仅开启Http代理,不改变系统代理 - - - 仅开启PAC,不改变系统代理 - 96, 16 @@ -226,107 +202,27 @@ 本地监听端口 + + 648, 437 + + + 654, 443 + + + Core:基础设置 + + + 654, 443 + - Core:路由设置 + Core:DNS设置 - - 3, 89 - - - 642, 481 - - - 634, 455 - - - 1.代理的Domain或IP - - - 628, 449 - - - 634, 455 - - - 2.直连的Domain或IP - - - 628, 449 - - - 634, 455 - - - 3.阻止的Domain或IP - - - 628, 449 - - - 634, 455 - - - 4.预定义规则 - - - 全局 - - - 绕过局域网地址 - - - 绕过大陆地址 - - - 绕过局域网及大陆地址 - - - 19, 26 - - - 244, 20 - - - 642, 72 - - - 77, 12 - - - 域名解析策略 - - - - NoControl - - - 351, 14 - - - 201, 23 - - - 一键设置默认自定义路由规则 - - - - True - - - 5, 49 - - - 383, 12 - - - *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP + + 654, 443 Core:KCP设置 - - v2rayN设置 - 156, 16 @@ -351,27 +247,30 @@ 允许来自局域网的连接 - - 227, 12 - - - 自定义GFWList地址(不需自定义请填空白) - 180, 16 开机自动启动(可能会不成功) - - 用户PAC设置 + + 654, 443 - - *设置用户PAC规则,用逗号(,)隔开 + + v2rayN设置 + + + 662, 469 确定(&O) + + 0, 479 + + + 662, 539 + 参数设置 diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs new file mode 100644 index 00000000..56ae1ccf --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.Designer.cs @@ -0,0 +1,159 @@ +namespace v2rayN.Forms +{ + partial class RoutingSettingControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingControl)); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.btnExpand = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.cmbroutingMode = new System.Windows.Forms.ComboBox(); + this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); + this.btnRemove = new System.Windows.Forms.Button(); + this.txtUserRule = new System.Windows.Forms.TextBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.btnExpand); + this.groupBox2.Controls.Add(this.label4); + this.groupBox2.Controls.Add(this.label1); + this.groupBox2.Controls.Add(this.cmbroutingMode); + this.groupBox2.Controls.Add(this.cmbOutboundTag); + this.groupBox2.Controls.Add(this.btnRemove); + this.groupBox2.Controls.Add(this.txtUserRule); + this.groupBox2.Controls.Add(this.txtRemarks); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // btnExpand + // + resources.ApplyResources(this.btnExpand, "btnExpand"); + this.btnExpand.Name = "btnExpand"; + this.btnExpand.UseVisualStyleBackColor = true; + this.btnExpand.Click += new System.EventHandler(this.btnExpand_Click); + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // cmbroutingMode + // + resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); + this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbroutingMode.FormattingEnabled = true; + this.cmbroutingMode.Items.AddRange(new object[] { + resources.GetString("cmbroutingMode.Items"), + resources.GetString("cmbroutingMode.Items1"), + resources.GetString("cmbroutingMode.Items2"), + resources.GetString("cmbroutingMode.Items3"), + resources.GetString("cmbroutingMode.Items4")}); + this.cmbroutingMode.Name = "cmbroutingMode"; + // + // cmbOutboundTag + // + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); + this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOutboundTag.FormattingEnabled = true; + this.cmbOutboundTag.Items.AddRange(new object[] { + resources.GetString("cmbOutboundTag.Items"), + resources.GetString("cmbOutboundTag.Items1"), + resources.GetString("cmbOutboundTag.Items2")}); + this.cmbOutboundTag.Name = "cmbOutboundTag"; + // + // btnRemove + // + resources.ApplyResources(this.btnRemove, "btnRemove"); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); + // + // txtUserRule + // + resources.ApplyResources(this.txtUserRule, "txtUserRule"); + this.txtUserRule.Name = "txtUserRule"; + this.txtUserRule.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // RoutingSettingControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox2); + this.Name = "RoutingSettingControl"; + this.Load += new System.EventHandler(this.RoutingSettingControl_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtUserRule; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button btnRemove; + private System.Windows.Forms.ComboBox cmbOutboundTag; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbroutingMode; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Button btnExpand; + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.cs b/v2rayN/v2rayN/Forms/RoutingSettingControl.cs new file mode 100644 index 00000000..2637aacf --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.cs @@ -0,0 +1,76 @@ +using System; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingSettingControl : UserControl + { + public event ChangeEventHandler OnButtonClicked; + + + public RoutingItem routingItem + { + get; set; + } + + public RoutingSettingControl() + { + InitializeComponent(); + } + + private void RoutingSettingControl_Load(object sender, EventArgs e) + { + BindingSub(); + } + + private void BindingSub() + { + if (routingItem != null) + { + txtRemarks.Text = routingItem.remarks.ToString(); + cmbOutboundTag.Text = routingItem.outboundTag; + int.TryParse(routingItem.routingMode, out int routingMode); + cmbroutingMode.SelectedIndex = routingMode; + txtUserRule.Text = Utils.List2String(routingItem.userRules, true); + } + } + private void EndBindingSub() + { + if (routingItem != null) + { + routingItem.remarks = txtRemarks.Text.TrimEx(); + routingItem.outboundTag = cmbOutboundTag.Text; + routingItem.routingMode = cmbroutingMode.SelectedIndex.ToString(); + routingItem.userRules = Utils.String2List(txtUserRule.Text); + } + } + private void txtRemarks_Leave(object sender, EventArgs e) + { + EndBindingSub(); + } + + private void btnRemove_Click(object sender, EventArgs e) + { + if (routingItem != null) + { + routingItem.remarks = string.Empty; + } + + OnButtonClicked?.Invoke(sender, e); + } + + private void btnExpand_Click(object sender, EventArgs e) + { + if (this.Height > 200) + { + this.Height = 160; + } + else + { + this.Height = 500; + } + } + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.resx b/v2rayN/v2rayN/Forms/RoutingSettingControl.resx new file mode 100644 index 00000000..7c33a91b --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.resx @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Pre-defined + + + + NoControl + + + + 733, 164 + + + 119, 20 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 9 + + + 127, 53 + + + 75, 23 + + + 127, 87 + + + Remove + + + txtRemarks + + + + 24 + + + 23 + + + RoutingSettingControl + + + 162, 21 + + + label1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 28 + + + 7 + + + proxy + + + 77, 12 + + + 362, 21 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6, 12 + + + label3 + + + 127, 21 + + + True + + + 0 + + + btnExpand + + + groupBox2 + + + 12, 87 + + + 2 + + + cmbroutingMode + + + 255, 20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Global + + + 71, 12 + + + Bypass mainland address + + + Bypassing the LAN address + + + 4 + + + 640, 21 + + + Fill + + + NoControl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 25 + + + groupBox2 + + + NoControl + + + 47, 12 + + + True + + + btnRemove + + + 0, 0 + + + 29 + + + label4 + + + NoControl + + + Out Tag + + + 27 + + + block + + + direct + + + 75, 23 + + + NoControl + + + 26 + + + 5 + + + groupBox2 + + + 6 + + + Expand + + + 1 + + + groupBox2 + + + groupBox2 + + + 588, 68 + + + True + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + True + + + Bypassing LAN and mainland address + + + NoControl + + + label2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 733, 164 + + + 8 + + + Top, Bottom, Left, Right + + + 12, 57 + + + cmbOutboundTag + + + 11 + + + Remarks + + + groupBox2 + + + 3 + + + True + + + 12, 25 + + + groupBox2 + + + 301, 26 + + + 47, 12 + + + Rule + + + 10 + + + Domain or IP + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtUserRule + + + 0 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + $this + + + Use custom Domain or IP + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 640, 46 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + True + + + zh-Hans + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx new file mode 100644 index 00000000..d95c2560 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingControl.zh-Hans.resx @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 619, 46 + + + 扩大 + + + 53, 12 + + + 出口标签 + + + 65, 12 + + + 预定义规则 + + + 使用自定义域名或IP + + + 全局 + + + 绕过局域网 + + + 绕过大陆地址 + + + 绕过局域网及大陆地址 + + + 619, 20 + + + 移除 + + + 567, 64 + + + 29, 12 + + + 备注 + + + 53, 12 + + + 域名或IP + + + 709, 160 + + + 规则 + + + 709, 160 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs new file mode 100644 index 00000000..5a87e09a --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -0,0 +1,151 @@ +namespace v2rayN.Forms +{ + partial class RoutingSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panCon = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnSetDefRountingRule = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.labRoutingTips = new System.Windows.Forms.Label(); + this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); + this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); + this.panel2.SuspendLayout(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // panCon + // + resources.ApplyResources(this.panCon, "panCon"); + this.panCon.Name = "panCon"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnAdd); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnAdd + // + resources.ApplyResources(this.btnAdd, "btnAdd"); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnSetDefRountingRule + // + resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule"); + this.btnSetDefRountingRule.Name = "btnSetDefRountingRule"; + this.btnSetDefRountingRule.UseVisualStyleBackColor = true; + this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click); + // + // panel1 + // + this.panel1.Controls.Add(this.btnSetDefRountingRule); + this.panel1.Controls.Add(this.labRoutingTips); + this.panel1.Controls.Add(this.linkLabelRoutingDoc); + this.panel1.Controls.Add(this.cmbdomainStrategy); + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // labRoutingTips + // + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.Name = "labRoutingTips"; + // + // linkLabelRoutingDoc + // + resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc"); + this.linkLabelRoutingDoc.Name = "linkLabelRoutingDoc"; + this.linkLabelRoutingDoc.TabStop = true; + this.linkLabelRoutingDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelRoutingDoc_LinkClicked); + // + // cmbdomainStrategy + // + this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbdomainStrategy.FormattingEnabled = true; + this.cmbdomainStrategy.Items.AddRange(new object[] { + resources.GetString("cmbdomainStrategy.Items"), + resources.GetString("cmbdomainStrategy.Items1"), + resources.GetString("cmbdomainStrategy.Items2")}); + resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); + this.cmbdomainStrategy.Name = "cmbdomainStrategy"; + // + // RoutingSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panCon); + this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "RoutingSettingForm"; + this.Load += new System.EventHandler(this.RoutingSettingForm_Load); + this.panel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Panel panCon; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; + private System.Windows.Forms.ComboBox cmbdomainStrategy; + private System.Windows.Forms.Button btnSetDefRountingRule; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs new file mode 100644 index 00000000..0b145a04 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class RoutingSettingForm : BaseForm + { + List lstControls = new List(); + + public RoutingSettingForm() + { + InitializeComponent(); + } + + private void RoutingSettingForm_Load(object sender, EventArgs e) + { + cmbdomainStrategy.Text = config.domainStrategy; + + if (config.routingItem == null) + { + config.routingItem = new List(); + } + + RefreshSubsView(); + } + + /// + /// 刷新列表 + /// + private void RefreshSubsView() + { + panCon.Controls.Clear(); + lstControls.Clear(); + + for (int k = config.routingItem.Count - 1; k >= 0; k--) + { + RoutingItem item = config.routingItem[k]; + if (Utils.IsNullOrEmpty(item.remarks)) + { + config.routingItem.RemoveAt(k); + } + } + + foreach (RoutingItem item in config.routingItem) + { + RoutingSettingControl control = new RoutingSettingControl(); + control.OnButtonClicked += Control_OnButtonClicked; + control.routingItem = item; + control.Dock = DockStyle.Top; + + panCon.Controls.Add(control); + panCon.Controls.SetChildIndex(control, 0); + + lstControls.Add(control); + } + } + + private void Control_OnButtonClicked(object sender, EventArgs e) + { + RefreshSubsView(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (config.routingItem.Count <= 0) + { + AddSub("proxy", ""); + } + if (ConfigHandler.SaveRoutingItem(ref config) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnAdd_Click(object sender, EventArgs e) + { + AddSub("proxy", ""); + + RefreshSubsView(); + } + + + private void AddSub(string outboundTag, string userRule, string routingMode = "0") + { + RoutingItem RoutingItem = new RoutingItem + { + remarks = outboundTag, + routingMode = routingMode, + outboundTag = outboundTag, + userRules = Utils.String2List(userRule) + + }; + config.routingItem.Add(RoutingItem); + } + + + private void btnSetDefRountingRule_Click(object sender, EventArgs e) + { + config.routingItem.Clear(); + + List lstTag = new List + { + Global.agentTag, + Global.directTag, + Global.blockTag + }; + for (int k = 0; k < lstTag.Count; k++) + { + DownloadHandle downloadHandle = new DownloadHandle(); + + string result = downloadHandle.WebDownloadStringSync(Global.CustomRoutingListUrl + lstTag[k]); + if (Utils.IsNullOrEmpty(result)) + { + result = Utils.GetEmbedText(Global.CustomRoutingFileName + lstTag[k]); + } + AddSub(lstTag[k], result); + } + + AddSub(Global.directTag, "", "4"); + AddSub(Global.agentTag, "", "0"); + + RefreshSubsView(); + } + + private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); + } + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx new file mode 100644 index 00000000..9c08b219 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + NoControl + + + + 568, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + True + + + Fill + + + 0, 68 + + + 765, 545 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + NoControl + + + 47, 17 + + + 75, 23 + + + 6 + + + &Add + + + btnAdd + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 475, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 613 + + + 765, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Top, Right + + + True + + + NoControl + + + 319, 17 + + + 229, 23 + + + 19 + + + Set default custom routing rules + + + btnSetDefRountingRule + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + NoControl + + + 10, 42 + + + 598, 16 + + + 13 + + + *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + True + + + NoControl + + + 6, 21 + + + 0, 0, 0, 0 + + + 95, 12 + + + 19 + + + Domain strategy + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 116, 17 + + + 165, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + Top + + + 0, 0 + + + 765, 68 + + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 765, 673 + + + Routing Settings + + + RoutingSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx new file mode 100644 index 00000000..dc3bb7b1 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + 添加(&A) + + + 确定(&O) + + + 一键设置默认自定义路由规则 + + + *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP + + + + 77, 12 + + + 域名解析策略 + + + 路由设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs index 30fcadf5..b23cac62 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -29,27 +29,38 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl)); - this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.grbMain = new System.Windows.Forms.GroupBox(); + this.btnShare = new System.Windows.Forms.Button(); this.chkEnabled = new System.Windows.Forms.CheckBox(); this.btnRemove = new System.Windows.Forms.Button(); this.txtUrl = new System.Windows.Forms.TextBox(); this.txtRemarks = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); - this.groupBox2.SuspendLayout(); + this.picQRCode = new System.Windows.Forms.PictureBox(); + this.grbMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); this.SuspendLayout(); // - // groupBox2 + // grbMain // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.chkEnabled); - this.groupBox2.Controls.Add(this.btnRemove); - this.groupBox2.Controls.Add(this.txtUrl); - this.groupBox2.Controls.Add(this.txtRemarks); - this.groupBox2.Controls.Add(this.label2); - this.groupBox2.Controls.Add(this.label3); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; + resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Controls.Add(this.btnShare); + this.grbMain.Controls.Add(this.chkEnabled); + this.grbMain.Controls.Add(this.btnRemove); + this.grbMain.Controls.Add(this.txtUrl); + this.grbMain.Controls.Add(this.txtRemarks); + this.grbMain.Controls.Add(this.label2); + this.grbMain.Controls.Add(this.label3); + this.grbMain.Name = "grbMain"; + this.grbMain.TabStop = false; + // + // btnShare + // + resources.ApplyResources(this.btnShare, "btnShare"); + this.btnShare.Name = "btnShare"; + this.btnShare.UseVisualStyleBackColor = true; + this.btnShare.Click += new System.EventHandler(this.btnShare_Click); // // chkEnabled // @@ -87,27 +98,37 @@ resources.ApplyResources(this.label3, "label3"); this.label3.Name = "label3"; // + // picQRCode + // + resources.ApplyResources(this.picQRCode, "picQRCode"); + this.picQRCode.Name = "picQRCode"; + this.picQRCode.TabStop = false; + // // SubSettingControl // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.groupBox2); + this.Controls.Add(this.picQRCode); + this.Controls.Add(this.grbMain); this.Name = "SubSettingControl"; this.Load += new System.EventHandler(this.SubSettingControl_Load); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); + this.grbMain.ResumeLayout(false); + this.grbMain.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); this.ResumeLayout(false); } #endregion - private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox grbMain; private System.Windows.Forms.TextBox txtUrl; private System.Windows.Forms.TextBox txtRemarks; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button btnRemove; private System.Windows.Forms.CheckBox chkEnabled; + private System.Windows.Forms.Button btnShare; + private System.Windows.Forms.PictureBox picQRCode; } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index 9836be5d..652e389e 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -1,6 +1,7 @@ using System; using System.Windows.Forms; using v2rayN.Base; +using v2rayN.Handler; using v2rayN.Mode; namespace v2rayN.Forms @@ -11,7 +12,10 @@ namespace v2rayN.Forms public event ChangeEventHandler OnButtonClicked; - public SubItem subItem { get; set; } + public SubItem subItem + { + get; set; + } public SubSettingControl() { @@ -20,6 +24,7 @@ namespace v2rayN.Forms private void SubSettingControl_Load(object sender, EventArgs e) { + this.Height = grbMain.Height; BindingSub(); } @@ -56,5 +61,23 @@ namespace v2rayN.Forms OnButtonClicked?.Invoke(sender, e); } + + private void btnShare_Click(object sender, EventArgs e) + { + if (this.Height <= grbMain.Height) + { + if (Utils.IsNullOrEmpty(subItem.url)) + { + picQRCode.Image = null; + return; + } + picQRCode.Image = QRCodeHelper.GetQRCode(subItem.url); + this.Height = grbMain.Height + 200; + } + else + { + this.Height = grbMain.Height; + } + } } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index a5dec524..fdeefb50 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -118,123 +118,270 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 6, 12 - - - zh-Hans - - - True - - - 584, 119 - - - NoControl - - - 484, 21 - - - 75, 23 - - - 24 - - - &Remove - - - True - - - NoControl - - - 406, 23 - - - 60, 16 - - - 25 - - - Enable - - - Bottom - - - 0, 9 - - - 584, 110 - - - 10 - - - Subscription details - - - True - NoControl - - 12, 25 + + grbMain - - 47, 12 + + + 60, 16 - - 10 + + txtUrl - - Remarks + + 6 - - True + + picQRCode - - NoControl + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 12, 55 + + Remove - - 83, 12 + + txtRemarks - - 0 + + + 24 - - Address (url) + + grbMain - - 127, 21 + + SubSettingControl - - 265, 21 + + Zoom - - 11 + + Subscription details - - 127, 55 + + 26 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True - - 432, 46 + + grbMain + + + 434, 21 + + + 83, 12 + + + 232, 21 + + + Top + + + 6, 12 + + + label3 + + + 127, 21 + + + True + + + Share + + + 619, 200 + + + 1 + + + 12, 55 + + + NoControl + + + Fill + + + $this + + + 25 + + + 127, 55 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + grbMain + + + 5 + + + 47, 12 + + + btnRemove + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable + + + chkEnabled + + + 4 + + + NoControl + + + 0, 110 + + + 75, 23 + + + 2 + + + grbMain + + + 25 + + + 10 23 + + grbMain + + + grbMain + + + 368, 23 + + + True + + + True + + + 0, 0 + + + $this + + + 0 + + + NoControl + + + label2 + + + 619, 110 + + + btnShare + + + 0 + + + NoControl + + + 619, 310 + + + 11 + + + Remarks + + + 0 + + + NoControl + + + 473, 46 + + + 12, 25 + + + 75, 23 + + + grbMain + + + 1 + + + Address (url) + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 525, 21 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + True + + + zh-Hans + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx index 95e5122f..6979e601 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -117,18 +117,18 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 移除 + + 分享 + 48, 16 启用 - - 订阅详情 + + 移除 29, 12 @@ -142,4 +142,7 @@ 地址 (url) + + 订阅详情 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx index e2001bb5..0f5ca1f3 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.resx +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -118,19 +118,61 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl + + + 448, 17 + + + 75, 23 + - - 6, 12 + + 4 - - 581, 629 + + &Cancel - + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + True - - Subscription settings + + Fill + + + 0, 0 + + + 614, 569 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 NoControl @@ -147,20 +189,17 @@ &Add - - NoControl + + btnAdd - - 448, 17 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 75, 23 + + panel2 - - 4 - - - &Cancel + + 0 NoControl @@ -177,20 +216,17 @@ &OK - - True + + btnOK - - Fill + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0 + + panel2 - - 581, 569 - - - 10 + + 2 Bottom @@ -199,9 +235,39 @@ 0, 569 - 581, 60 + 614, 60 7 + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 614, 629 + + + Subscription settings + + + SubSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 55eeea14..7c96ee51 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -23,7 +23,6 @@ namespace v2rayN /// public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/"; - public const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; /// /// PromotionUrl @@ -56,10 +55,7 @@ namespace v2rayN /// v2ray配置Httpresponse文件名 /// public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse.txt"; - /// - /// 空白的pac文件 - /// - public const string BlankPacFileName = "v2rayN.Sample.BlankPac.txt"; + public const string CustomRoutingFileName = "v2rayN.Sample.custom_routing_"; @@ -97,7 +93,7 @@ namespace v2rayN /// /// 阻止 tag值 /// - public const string blockTag = "block"; + public const string blockTag = "block"; /// /// @@ -161,11 +157,6 @@ namespace v2rayN /// public const string trojanProtocolLite = "trojan"; - /// - /// pac - /// - public const string pacFILE = "pac.txt"; - /// /// email /// @@ -231,13 +222,6 @@ namespace v2rayN get; set; } - /// - /// PAC端口 - /// - public static int pacPort - { - get; set; - } /// /// diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 37a9878e..ddce8665 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -86,22 +86,10 @@ namespace v2rayN.Handler if (Utils.IsNullOrEmpty(config.domainStrategy)) { config.domainStrategy = "IPIfNonMatch"; - } - if (Utils.IsNullOrEmpty(config.routingMode)) + } + if (config.routingItem == null) { - config.routingMode = "0"; - } - if (config.useragent == null) - { - config.useragent = new List(); - } - if (config.userdirect == null) - { - config.userdirect = new List(); - } - if (config.userblock == null) - { - config.userblock = new List(); + config.routingItem = new List(); } //kcp if (config.kcpItem == null) @@ -139,10 +127,6 @@ namespace v2rayN.Handler { config.speedPingTestUrl = Global.SpeedPingTestUrl; } - if (Utils.IsNullOrEmpty(config.urlGFWList)) - { - config.urlGFWList = Global.GFWLIST_URL; - } //if (Utils.IsNullOrEmpty(config.remoteDNS)) //{ // config.remoteDNS = "1.1.1.1"; @@ -152,10 +136,6 @@ namespace v2rayN.Handler { config.subItem = new List(); } - if (config.userPacRule == null) - { - config.userPacRule = new List(); - } if (config == null || config.index < 0 @@ -299,7 +279,8 @@ namespace v2rayN.Handler path = config.vmess[index].path, streamSecurity = config.vmess[index].streamSecurity, allowInsecure = config.vmess[index].allowInsecure, - configType = config.vmess[index].configType + configType = config.vmess[index].configType, + flow = config.vmess[index].flow }; config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 @@ -1080,5 +1061,28 @@ namespace v2rayN.Handler return 0; } + + /// + /// SaveRoutingItem + /// + /// + /// + public static int SaveRoutingItem(ref Config config) + { + if (config.routingItem == null || config.routingItem.Count <= 0) + { + return -1; + } + + foreach (RoutingItem sub in config.routingItem) + { + + } + Global.reloadV2ray = true; + + ToJsonFile(config); + return 0; + } + } } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 67a936f2..369fbc72 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -54,8 +54,10 @@ namespace v2rayN.Handler private readonly string nLatestUrl = "https://github.com/2dust/v2rayN/releases/latest"; private const string nUrl = "https://github.com/2dust/v2rayN/releases/download/{0}/v2rayN.zip"; - private readonly string coreLatestUrl = "https://github.com/v2fly/v2ray-core/releases/latest"; - private const string coreUrl = "https://github.com/v2fly/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; + private readonly string v2flyCoreLatestUrl = "https://github.com/v2fly/v2ray-core/releases/latest"; + private const string v2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; + private readonly string xrayCoreLatestUrl = "https://github.com/xtls/xray-core/releases/latest"; + private const string xrayCoreUrl = "https://github.com/xtls/xray-core/releases/download/{0}/xray-windows-{1}.zip"; public async void CheckUpdateAsync(string type) { @@ -67,9 +69,13 @@ namespace v2rayN.Handler HttpClient httpClient = new HttpClient(webRequestHandler); string url; - if (type == "Core") + if (type == "v2fly") { - url = coreLatestUrl; + url = v2flyCoreLatestUrl; + } + else if (type == "xray") + { + url = xrayCoreLatestUrl; } else if (type == "v2rayN") { @@ -94,11 +100,23 @@ namespace v2rayN.Handler /// /// 获取V2RayCore版本 /// - public string getV2rayVersion() + public string getCoreVersion(string type) { try { - string filePath = Utils.GetPath("V2ray.exe"); + var core = string.Empty; + var match = string.Empty; + if (type == "v2fly") + { + core = "v2ray.exe"; + match = "V2Ray"; + } + else if (type == "xray") + { + core = "xray.exe"; + match = "Xray"; + } + string filePath = Utils.GetPath(core); if (!File.Exists(filePath)) { string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2fly/v2ray-core/releases"); @@ -117,10 +135,9 @@ namespace v2rayN.Handler p.Start(); p.WaitForExit(5000); string echo = p.StandardOutput.ReadToEnd(); - string version = Regex.Match(echo, "V2Ray ([0-9.]+) \\(").Groups[1].Value; + string version = Regex.Match(echo, $"{match} ([0-9.]+) \\(").Groups[1].Value; return version; } - catch (Exception ex) { Utils.SaveLog(ex.Message, ex); @@ -136,12 +153,19 @@ namespace v2rayN.Handler string curVersion; string message; string url; - if (type == "Core") + if (type == "v2fly") { - curVersion = "v" + getV2rayVersion(); + curVersion = "v" + getCoreVersion(type); message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(coreUrl, version, osBit); + url = string.Format(v2flyCoreUrl, version, osBit); + } + else if (type == "xray") + { + curVersion = "v" + getCoreVersion(type); + message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); + string osBit = Environment.Is64BitProcess ? "64" : "32"; + url = string.Format(xrayCoreUrl, version, osBit); } else if (type == "v2rayN") { @@ -313,47 +337,24 @@ namespace v2rayN.Handler } } - #endregion - - #region PAC - - public string GenPacFile(string result) + public string WebDownloadStringSync(string url) { + string source = string.Empty; try { - File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), result, Encoding.UTF8); - List lines = ParsePacResult(result); - string abpContent = Utils.UnGzip(Resources.abp_js); - abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); - File.WriteAllText(Utils.GetPath(Global.pacFILE), abpContent, Encoding.UTF8); + Utils.SetSecurityProtocol(); + + WebClientEx ws = new WebClientEx(); + + return ws.DownloadString(new Uri(url)); } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - return ex.Message; + return string.Empty; } - return string.Empty; } - - private List ParsePacResult(string response) - { - IEnumerable IgnoredLineBegins = new[] { '!', '[' }; - - byte[] bytes = Convert.FromBase64String(response); - string content = Encoding.UTF8.GetString(bytes); - List valid_lines = new List(); - using (StringReader sr = new StringReader(content)) - { - foreach (string line in sr.NonWhiteSpaceLines()) - { - if (line.BeginWithAny(IgnoredLineBegins)) - continue; - valid_lines.Add(line); - } - } - return valid_lines; - } - #endregion + } } diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 419ba374..95142bb5 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -32,7 +32,7 @@ namespace v2rayN.Handler try { Color color = ColorTranslator.FromHtml("#3399CC"); - int index = (int)config.listenerType; + int index = (int)config.sysProxyType; if (index > 0) { color = (new Color[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index b02ea327..654a7571 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -166,6 +166,13 @@ namespace v2rayN.Handler //开启udp inbound.settings.udp = config.inbound[0].udpEnabled; inbound.sniffing.enabled = config.inbound[0].sniffingEnabled; + + //http + Inbounds inbound2 = v2rayConfig.inbounds[1]; + inbound2.port = config.GetLocalPort(Global.InboundHttp); + inbound2.protocol = Global.InboundHttp; + inbound2.listen = inbound.listen; + inbound2.settings.allowTransparent = false; } catch { @@ -188,31 +195,31 @@ namespace v2rayN.Handler { v2rayConfig.routing.domainStrategy = config.domainStrategy; - //自定义 - //需代理 - routingUserRule(config.useragent, Global.agentTag, ref v2rayConfig); - //直连 - routingUserRule(config.userdirect, Global.directTag, ref v2rayConfig); - //阻止 - routingUserRule(config.userblock, Global.blockTag, ref v2rayConfig); - - - switch (config.routingMode) + foreach (var item in config.routingItem) { - case "0": - break; - case "1": - routingGeo("ip", "private", Global.directTag, ref v2rayConfig); - break; - case "2": - routingGeo("", "cn", Global.directTag, ref v2rayConfig); - break; - case "3": - routingGeo("ip", "private", Global.directTag, ref v2rayConfig); - routingGeo("", "cn", Global.directTag, ref v2rayConfig); - break; + if (item.routingMode != "0") + { + switch (item.routingMode) + { + case "1": + break; + case "2": + routingGeo("ip", "private", Global.directTag, ref v2rayConfig); + break; + case "3": + routingGeo("", "cn", Global.directTag, ref v2rayConfig); + break; + case "4": + routingGeo("ip", "private", Global.directTag, ref v2rayConfig); + routingGeo("", "cn", Global.directTag, ref v2rayConfig); + break; + } + } + else + { + routingUserRule(item.userRules, item.outboundTag, ref v2rayConfig); + } } - } } catch @@ -224,8 +231,19 @@ namespace v2rayN.Handler { try { - if (userRule != null - && userRule.Count > 0) + if (userRule == null) + { + } + else if (userRule.Count == 0) + { + v2rayConfig.routing.rules.Add(new RulesItem + { + type = "field", + outboundTag = tag, + port = "0-65535" + }); + } + else if (userRule.Count > 0) { //Domain RulesItem rulesDomain = new RulesItem @@ -470,7 +488,7 @@ namespace v2rayN.Handler usersItem.flow = string.Empty; usersItem.email = Global.userEMail; usersItem.encryption = config.security(); - + //Mux outbound.mux.enabled = config.muxEnabled; outbound.mux.concurrency = config.muxEnabled ? 8 : -1; @@ -490,7 +508,7 @@ namespace v2rayN.Handler { usersItem.flow = config.flow(); } - + outbound.mux.enabled = false; outbound.mux.concurrency = -1; } @@ -624,7 +642,7 @@ namespace v2rayN.Handler //ws case "ws": WsSettings wsSettings = new WsSettings - { + { }; string path = config.path(); @@ -744,21 +762,30 @@ namespace v2rayN.Handler { return 0; } - List servers = new List(); - string[] arrDNS = config.remoteDNS.Split(','); - foreach (string str in arrDNS) + var obj = Utils.ParseJson(config.remoteDNS); + if (obj != null && obj.ContainsKey("servers")) { - //if (Utils.IsIP(str)) - //{ - servers.Add(str); - //} + v2rayConfig.dns = obj; } - //servers.Add("localhost"); - v2rayConfig.dns = new Mode.Dns + else { - servers = servers - }; + List servers = new List(); + + string[] arrDNS = config.remoteDNS.Split(','); + foreach (string str in arrDNS) + { + //if (Utils.IsIP(str)) + //{ + servers.Add(str); + //} + } + //servers.Add("localhost"); + v2rayConfig.dns = new Mode.Dns + { + servers = servers + }; + } } catch { @@ -783,8 +810,8 @@ namespace v2rayN.Handler apiObj.services = services.ToList(); v2rayConfig.api = apiObj; - policySystemSetting.statsInboundDownlink = true; - policySystemSetting.statsInboundUplink = true; + policySystemSetting.statsOutboundDownlink = true; + policySystemSetting.statsOutboundUplink = true; policyObj.system = policySystemSetting; v2rayConfig.policy = policyObj; @@ -1450,7 +1477,7 @@ namespace v2rayN.Handler else { vmessItem.remarks = WebUtility.UrlDecode(remarks); - } + } } else { @@ -1743,7 +1770,7 @@ namespace v2rayN.Handler //routing(config, ref v2rayConfig); dns(configCopy, ref v2rayConfig); - v2rayConfig.inbounds.RemoveAt(0); // Remove "proxy" service for speedtest, avoiding port conflicts. + v2rayConfig.inbounds.Clear(); // Remove "proxy" service for speedtest, avoiding port conflicts. int httpPort = configCopy.GetLocalPort("speedtest"); foreach (int index in selecteds) diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index 0236c5a8..cab3c055 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -10,23 +10,20 @@ namespace v2rayN.HttpProxyHandler { noHttpProxy = 0, GlobalHttp = 1, - GlobalPac = 2, - HttpOpenAndClear = 3, - PacOpenAndClear = 4, - HttpOpenOnly = 5, - PacOpenOnly = 6 + HttpOpenAndClear = 2, + HttpOpenOnly = 3, } /// /// 系统代理(http)总处理 /// 启动privoxy提供http协议 - /// 设置IE系统代理或者PAC模式 + /// 设置IE系统代理 /// class HttpProxyHandle { private static bool Update(Config config, bool forceDisable) { - ListenerType type = config.listenerType; - + // ListenerType type = config.listenerType; + var type = ListenerType.noHttpProxy; if (forceDisable) { type = ListenerType.noHttpProxy; @@ -43,47 +40,21 @@ namespace v2rayN.HttpProxyHandler } if (type == ListenerType.GlobalHttp) { - //PACServerHandle.Stop(); //ProxySetting.SetProxy($"{Global.Loopback}:{port}", Global.IEProxyExceptions, 2); SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}"); } - else if (type == ListenerType.GlobalPac) - { - string pacUrl = GetPacUrl(); - //ProxySetting.SetProxy(pacUrl, "", 4); - SysProxyHandle.SetIEProxy(true, false, pacUrl); - //PACServerHandle.Stop(); - PACServerHandle.Init(config); - } else if (type == ListenerType.HttpOpenAndClear) { - //PACServerHandle.Stop(); SysProxyHandle.ResetIEProxy(); } - else if (type == ListenerType.PacOpenAndClear) - { - string pacUrl = GetPacUrl(); - SysProxyHandle.ResetIEProxy(); - //PACServerHandle.Stop(); - PACServerHandle.Init(config); - } else if (type == ListenerType.HttpOpenOnly) { - //PACServerHandle.Stop(); //SysProxyHandle.ResetIEProxy(); } - else if (type == ListenerType.PacOpenOnly) - { - string pacUrl = GetPacUrl(); - //SysProxyHandle.ResetIEProxy(); - //PACServerHandle.Stop(); - PACServerHandle.Init(config); - } } else { SysProxyHandle.ResetIEProxy(); - //PACServerHandle.Stop(); } } catch (Exception ex) @@ -110,7 +81,6 @@ namespace v2rayN.HttpProxyHandler Global.sysAgent = true; Global.socksPort = localPort; Global.httpPort = PrivoxyHandler.Instance.RunningPort; - Global.pacPort = config.GetLocalPort("pac"); } } } @@ -127,10 +97,10 @@ namespace v2rayN.HttpProxyHandler { try { - if (config.listenerType != ListenerType.HttpOpenOnly && config.listenerType != ListenerType.PacOpenOnly) - { - Update(config, true); - } + //if (config.listenerType != ListenerType.HttpOpenOnly) + //{ + // Update(config, true); + //} PrivoxyHandler.Instance.Stop(); @@ -151,11 +121,11 @@ namespace v2rayN.HttpProxyHandler public static void RestartHttpAgent(Config config, bool forced) { bool isRestart = false; - if (config.listenerType == ListenerType.noHttpProxy) - { - // 关闭http proxy时,直接返回 - return; - } + //if (config.listenerType == ListenerType.noHttpProxy) + //{ + // // 关闭http proxy时,直接返回 + // return; + //} //强制重启或者socks端口变化 if (forced) { @@ -177,10 +147,40 @@ namespace v2rayN.HttpProxyHandler Update(config, false); } - public static string GetPacUrl() + public static bool UpdateSysProxy(Config config, bool forceDisable) { - string pacUrl = $"http://{Global.Loopback}:{Global.pacPort}/pac/?t={ DateTime.Now.ToString("HHmmss")}"; - return pacUrl; + var type = config.sysProxyType; + + if (forceDisable) + { + type = ESysProxyType.ForcedClear; + } + + try + { + Global.httpPort = config.GetLocalPort(Global.InboundHttp); + int port = Global.httpPort; + if (port <= 0) + { + return false; + } + if (type == ESysProxyType.ForcedChange) + { + SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}"); + } + else if (type == ESysProxyType.ForcedClear) + { + SysProxyHandle.ResetIEProxy(); + } + else if (type == ESysProxyType.Unchanged) + { + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return true; } } } diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs deleted file mode 100644 index 23bf8087..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs +++ /dev/null @@ -1,209 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using v2rayN.Mode; -using v2rayN.Properties; -using v2rayN.Tool; -using v2rayN.Base; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// 提供PAC功能支持 - /// - class PACServerHandle - { - private static int pacPort = 0; - private static HttpWebServer server; - private static HttpWebServerB serverB; - private static Config _config; - - public static bool IsRunning - { - get - { - return (pacPort > 0); - } - } - - public static void Init(Config config) - { - _config = config; - Global.pacPort = config.GetLocalPort("pac"); - - if (InitServer("*")) - { - pacPort = Global.pacPort; - } - //else if (InitServer(Global.Loopback)) - //{ - // pacPort = Global.pacPort; - //} - else if (InitServerB(Global.Loopback)) - { - pacPort = Global.pacPort; - } - else - { - Utils.SaveLog("Webserver init failed "); - pacPort = 0; - } - } - - private static bool InitServer(string address) - { - try - { - if (pacPort != Global.pacPort) - { - if (server != null) - { - server.Stop(); - server = null; - } - - if (server == null) - { - string prefixes = string.Format("http://{0}:{1}/pac/", address, Global.pacPort); - Utils.SaveLog("Webserver prefixes " + prefixes); - - server = new HttpWebServer(SendResponse, prefixes); - server.Run(); - - } - } - Utils.SaveLog("Webserver at " + address); - } - catch (Exception ex) - { - Utils.SaveLog("Webserver InitServer " + ex.Message); - return false; - } - return true; - } - - public static bool InitServerB(string address) - { - try - { - if (pacPort != Global.pacPort) - { - if (serverB != null) - { - serverB.Stop(); - serverB = null; - } - - if (serverB == null) - { - serverB = new HttpWebServerB(Global.pacPort, SendResponse); - } - } - Utils.SaveLog("WebserverB at " + address); - } - catch (Exception ex) - { - Utils.SaveLog("WebserverB InitServer " + ex.Message); - return false; - } - return true; - } - - public static string SendResponse(string address) - { - try - { - string pac = GetPacList(address); - return pac; - } - catch (Exception ex) - { - Utils.SaveLog("Webserver SendResponse " + ex.Message); - return ex.Message; - } - } - - public static void Stop() - { - try - { - if (server != null) - { - server.Stop(); - server = null; - } - if (serverB != null) - { - serverB.Stop(); - serverB = null; - } - } - catch (Exception ex) - { - Utils.SaveLog("Webserver Stop " + ex.Message); - } - - //try - //{ - // if (httpWebServer == null) - // { - // return; - // } - // foreach (var key in httpWebServer.Keys) - // { - // Utils.SaveLog("Webserver Stop " + key.ToString()); - // ((HttpWebServer)httpWebServer[key]).Stop(); - // } - // httpWebServer.Clear(); - //} - //catch (Exception ex) - //{ - // Utils.SaveLog("Webserver Stop " + ex.Message); - //} - } - - private static string GetPacList(string address) - { - int port = Global.httpPort; - if (port <= 0) - { - return "No port"; - } - try - { - List lstProxy = new List - { - string.Format("PROXY {0}:{1};", address, port) - }; - string proxy = string.Join("", lstProxy.ToArray()); - - string strPacfile = Utils.GetPath(Global.pacFILE); - if (!File.Exists(strPacfile)) - { - FileManager.UncompressFile(strPacfile, Resources.pac_txt); - } - string pac = File.ReadAllText(strPacfile, Encoding.UTF8); - pac = pac.Replace("__PROXY__", proxy); - - if (_config.userPacRule.Count > 0) - { - string keyWords = "var rules = ["; - if (pac.IndexOf(keyWords) >= 0) - { - string userPac = string.Join($"\",{Environment.NewLine}\"", _config.userPacRule.ToArray()); - userPac = string.Format("\"{0}\",", userPac); - pac = pac.Replace(keyWords, keyWords + userPac); - } - } - - return pac; - } - catch - { - } - return "No pac content"; - } - - } -} diff --git a/v2rayN/v2rayN/Mode/ComboItem.cs b/v2rayN/v2rayN/Mode/ComboItem.cs new file mode 100644 index 00000000..e69373ef --- /dev/null +++ b/v2rayN/v2rayN/Mode/ComboItem.cs @@ -0,0 +1,14 @@ +namespace v2rayN.Mode +{ + class ComboItem + { + public int ID + { + get; set; + } + public string Text + { + get; set; + } + } +} diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index fb737942..42c01f70 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -67,39 +67,6 @@ namespace v2rayN.Mode { get; set; } - - /// - /// 路由模式 - /// - public string routingMode - { - get; set; - } - - /// - /// 用户自定义需代理的网址或ip - /// - public List useragent - { - get; set; - } - - /// - /// 用户自定义直连的网址或ip - /// - public List userdirect - { - get; set; - } - - /// - /// 用户自定义阻止的网址或ip - /// - public List userblock - { - get; set; - } - /// /// KcpItem /// @@ -109,9 +76,9 @@ namespace v2rayN.Mode } /// - /// 监听状态 + /// /// - public ListenerType listenerType + public ESysProxyType sysProxyType { get; set; } @@ -129,14 +96,7 @@ namespace v2rayN.Mode public string speedPingTestUrl { get; set; - } - /// - /// 自定义GFWList url - /// - public string urlGFWList - { - get; set; - } + } /// /// 允许来自局域网的连接 @@ -201,8 +161,7 @@ namespace v2rayN.Mode { get; set; } - - public List userPacRule + public List routingItem { get; set; } @@ -317,10 +276,7 @@ namespace v2rayN.Mode { return GetLocalPort(Global.InboundSocks) + 1; } - else if (protocol == "pac") - { - return GetLocalPort(Global.InboundSocks) + 2; - } + else if (protocol == "speedtest") { return GetLocalPort(Global.InboundSocks) + 103; @@ -737,4 +693,40 @@ namespace v2rayN.Mode get; set; } } + + [Serializable] + public class RoutingItem + { + /// + /// + /// + public string remarks + { + get; set; + } + + /// + /// 路由模式 + /// + public string routingMode + { + get; set; + } + + /// + /// + /// + public string outboundTag + { + get; set; + } + + /// + /// + /// + public List userRules + { + get; set; + } + } } diff --git a/v2rayN/v2rayN/Mode/ERoutingSort.cs b/v2rayN/v2rayN/Mode/ERoutingSort.cs new file mode 100644 index 00000000..2df23d2d --- /dev/null +++ b/v2rayN/v2rayN/Mode/ERoutingSort.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum ERoutingSort + { + UserProxy = 1, + UserDirect = 2, + UserBlock = 3, + UserPredefined = 4 + } +} diff --git a/v2rayN/v2rayN/Mode/ESysProxyType.cs b/v2rayN/v2rayN/Mode/ESysProxyType.cs new file mode 100644 index 00000000..13f63c7e --- /dev/null +++ b/v2rayN/v2rayN/Mode/ESysProxyType.cs @@ -0,0 +1,10 @@ + +namespace v2rayN.Mode +{ + public enum ESysProxyType + { + Unchanged = 0, + ForcedChange = 1, + ForcedClear = 2 + } +} diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index bc85c18f..9ec65af0 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -35,7 +35,7 @@ namespace v2rayN.Mode /// /// DNS 配置 /// - public Dns dns { get; set; } + public object dns { get; set; } /// /// 路由配置 /// @@ -57,8 +57,8 @@ namespace v2rayN.Mode public class SystemPolicy { - public bool statsInboundUplink; - public bool statsInboundDownlink; + public bool statsOutboundUplink; + public bool statsOutboundDownlink; } public class Log @@ -138,7 +138,9 @@ namespace v2rayN.Mode /// VLESS /// public string decryption { get; set; } - + + public bool allowTransparent { get; set; } + } public class UsersItem diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 152885aa..79c9ddd1 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("3.29")] +[assembly: AssemblyFileVersion("4.0")] diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index f21638d7..2088590e 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace v2rayN.Properties { // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -70,16 +70,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] abp_js { - get { - object obj = ResourceManager.GetObject("abp_js", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -130,16 +120,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] pac_txt { - get { - object obj = ResourceManager.GetObject("pac_txt", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// 查找类似 listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ ///toggle 0 diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx index 706454a0..2aa66967 100644 --- a/v2rayN/v2rayN/Properties/Resources.resx +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -157,15 +157,9 @@ ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/v2rayN/v2rayN/Resources/abp.js.gz b/v2rayN/v2rayN/Resources/abp.js.gz deleted file mode 100644 index 0577c7f5c14d22f0a4f0c744f3284da191c04cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4467 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 F007W`%bNfI diff --git a/v2rayN/v2rayN/Resources/pac.txt.gz b/v2rayN/v2rayN/Resources/pac.txt.gz deleted file mode 100644 index 7f621cb7468cd724fc93df9c7b4b386516c3973c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44429 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 diff --git a/v2rayN/v2rayN/Sample/BlankPac.txt b/v2rayN/v2rayN/Sample/BlankPac.txt deleted file mode 100644 index 906a14cb..00000000 --- a/v2rayN/v2rayN/Sample/BlankPac.txt +++ /dev/null @@ -1,5 +0,0 @@ -var proxy = "__PROXY__"; - -function FindProxyForURL(url, host) { - return proxy; -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleClientConfig.txt b/v2rayN/v2rayN/Sample/SampleClientConfig.txt index a582c6ea..f2924c9a 100644 --- a/v2rayN/v2rayN/Sample/SampleClientConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleClientConfig.txt @@ -1,17 +1,11 @@ -{ - "log": { - "access": "", - "error": "", - "loglevel": "error" - }, +{ "log": { "access": "Vaccess.log", "error": "Verror.log", "loglevel": "warning" }, - "inbounds": [ - { - "tag": "proxy", + "inbounds": [{ + "tag": "tag1", "port": 10808, "protocol": "socks", "listen": "127.0.0.1", @@ -26,6 +20,22 @@ "tls" ] } + }, + { + "tag": "tag2", + "port": 10809, + "protocol": "socks", + "listen": "127.0.0.1", + "settings": { + "allowTransparent": false + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } } ], "outbounds": [{ diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 22c37976..8fa10c63 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -19,6 +19,7 @@ using ZXing.Common; using ZXing.QrCode; using System.Security.Principal; using v2rayN.Base; +using Newtonsoft.Json.Linq; namespace v2rayN { @@ -146,6 +147,19 @@ namespace v2rayN } return result; } + + public static JObject ParseJson(string strJson) + { + try + { + JObject obj = JObject.Parse(strJson); + return obj; + } + catch + { + return null; + } + } #endregion #region 转换函数 diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index d1f912ba..51a06fb1 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -125,12 +125,25 @@ BaseServerForm.cs + Form MainForm.cs + + Form + + + RoutingSettingForm.cs + + + UserControl + + + RoutingSettingControl.cs + Form @@ -165,16 +178,16 @@ - - - Component + + + @@ -287,6 +300,13 @@ QRCodeControl.cs Designer + + RoutingSettingControl.cs + Designer + + + RoutingSettingControl.cs + SubSettingControl.cs Designer @@ -294,6 +314,13 @@ SubSettingControl.cs + + RoutingSettingForm.cs + Designer + + + RoutingSettingForm.cs + SubSettingForm.cs Designer @@ -347,8 +374,6 @@ - - @@ -411,7 +436,6 @@ -