diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index a88afb44..98ba9904 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -63,7 +63,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs index 78192e45..06d43374 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -96,7 +96,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } private void btnClose_Click(object sender, EventArgs e) @@ -124,7 +124,7 @@ namespace v2rayN.Forms VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { - UI.Show(msg); + UI.ShowWarning(msg); return; } diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs index 6adad2c1..90fc63ac 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs @@ -85,7 +85,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } private void btnClose_Click(object sender, EventArgs e) @@ -113,7 +113,7 @@ namespace v2rayN.Forms VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { - UI.Show(msg); + UI.ShowWarning(msg); return; } diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 6d09db03..e2747b6c 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -166,7 +166,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } @@ -233,7 +233,7 @@ namespace v2rayN.Forms } if (vmessItem == null) { - UI.Show(msg); + UI.ShowWarning(msg); return; } @@ -261,7 +261,7 @@ namespace v2rayN.Forms VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { - UI.Show(msg); + UI.ShowWarning(msg); return; } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 20c846d0..223bba24 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -804,7 +804,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("FailedImportedCustomServer")); + UI.ShowWarning(UIRes.I18N("FailedImportedCustomServer")); } } @@ -1197,7 +1197,7 @@ namespace v2rayN.Forms } else { - downloadHandle.DownloadFileAsync(config, url, null, -1); + downloadHandle.DownloadFileAsync(url, null, -1); } })); } @@ -1237,7 +1237,7 @@ namespace v2rayN.Forms }; } - AppendText(false, UIRes.I18N("MsgStartUpdatingV2rayCore")); + AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayN")); downloadHandle.CheckUpdateAsync("v2rayN"); } @@ -1263,7 +1263,7 @@ namespace v2rayN.Forms } else { - downloadHandle.DownloadFileAsync(config, url, null, -1); + downloadHandle.DownloadFileAsync(url, null, -1); } })); } @@ -1310,7 +1310,7 @@ namespace v2rayN.Forms }; } - AppendText(false, UIRes.I18N("MsgStartUpdatingV2rayCore")); + AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayCore")); downloadHandle.CheckUpdateAsync("Core"); } @@ -1391,7 +1391,7 @@ namespace v2rayN.Forms string result = Convert.ToString(e.UserState); if (Utils.IsNullOrEmpty(result)) { - UI.Show(UIRes.I18N("NoValidQRcodeFound")); + UI.ShowWarning(UIRes.I18N("NoValidQRcodeFound")); } else { diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index c1152594..294ebe73 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -181,7 +181,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } @@ -389,15 +389,19 @@ namespace v2rayN.Forms txtUserblock.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.blockTag); cmbroutingMode.SelectedIndex = 3; - List lstUrl = new List(); - lstUrl.Add(Global.CustomRoutingListUrl + Global.agentTag); - lstUrl.Add(Global.CustomRoutingListUrl + Global.directTag); - lstUrl.Add(Global.CustomRoutingListUrl + Global.blockTag); + List lstUrl = new List + { + Global.CustomRoutingListUrl + Global.agentTag, + Global.CustomRoutingListUrl + Global.directTag, + Global.CustomRoutingListUrl + Global.blockTag + }; - List lstTxt = new List(); - lstTxt.Add(txtUseragent); - lstTxt.Add(txtUserdirect); - lstTxt.Add(txtUserblock); + List lstTxt = new List + { + txtUseragent, + txtUserdirect, + txtUserblock + }; for (int k = 0; k < lstUrl.Count; k++) { diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 7a289ee6..00829fc2 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -226,7 +226,7 @@ 23 - Boot automatically + Automatically start at system startup True @@ -244,7 +244,7 @@ 29 - Enable Statistics(Realtime net speed and traffic data amount. Need restart v2rayN client) + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) True diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs index 0cc90ae2..c8e7725b 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.cs +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -79,7 +79,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 68bef5ae..3f1cd7a7 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -221,6 +221,10 @@ namespace v2rayN { get; set; } + public static System.Threading.Mutex mutexObj + { + get; set; + } #endregion diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index d816617a..eb396e72 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -540,8 +540,7 @@ namespace v2rayN.Handler /// public static int AddCustomServer(ref Config config, string fileName) { - string newFileName = string.Empty; - newFileName = string.Format("{0}.json", Utils.GetGUID()); + string newFileName = string.Format("{0}.json", Utils.GetGUID()); //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); try diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 2c76da01..bf99a25f 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -172,12 +172,12 @@ namespace v2rayN.Handler #region Download - public void DownloadFileAsync(Config config, string url, WebProxy webProxy, int downloadTimeout) + public void DownloadFileAsync(string url, WebProxy webProxy, int downloadTimeout) { try { Utils.SetSecurityProtocol(); - UpdateCompleted?.Invoke(this, new ResultEventArgs(false, "Downloading...")); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading"))); progressPercentage = -1; totalBytesToReceive = 0; diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index e39623d3..f9d66496 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -101,7 +101,7 @@ namespace v2rayN.Handler } else { - UI.Show(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); } } @@ -141,7 +141,7 @@ namespace v2rayN.Handler } else { - UI.Show(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); } } diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index cbfc165a..88dedf27 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -100,14 +100,14 @@ namespace v2rayN.Handler private void RunRealPing() { + int pid = -1; try { string msg = string.Empty; - Global.reloadV2ray = true; - _v2rayHandler.LoadV2ray(_config, _selecteds); + pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); - Thread.Sleep(5000); + //Thread.Sleep(5000); int httpPort = _config.GetLocalPort("speedtest"); Task[] tasks = new Task[_selecteds.Count]; int i = -1; @@ -119,7 +119,8 @@ namespace v2rayN.Handler } i++; - tasks[i] = Task.Run(() => { + tasks[i] = Task.Run(() => + { try { WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); @@ -137,28 +138,28 @@ namespace v2rayN.Handler } Task.WaitAll(tasks); - Global.reloadV2ray = true; - _v2rayHandler.LoadV2ray(_config); Thread.Sleep(100); } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); } + finally + { + if (pid > 0) _v2rayHandler.V2rayStopPid(pid); + } } - private void RunSpeedTest() { + int pid = -1; + if (_config.vmess.Count <= 0) { return; } - Global.reloadV2ray = true; - _v2rayHandler.LoadV2ray(_config, _selecteds); - - Thread.Sleep(5000); + pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); string url = _config.speedTestUrl; testCounter = 0; @@ -167,53 +168,35 @@ namespace v2rayN.Handler downloadHandle2 = new DownloadHandle(); downloadHandle2.UpdateCompleted += (sender2, args) => { - if (args.Success) - { - _updateFunc(ItemIndex, args.Msg); - if (ServerSpeedTestSub(testCounter, url) != 0) - { - return; - } - } - else - { - _updateFunc(ItemIndex, args.Msg); - } + _updateFunc(ItemIndex, args.Msg); + if (args.Success) StartNext(); }; downloadHandle2.Error += (sender2, args) => { _updateFunc(ItemIndex, args.GetException().Message); - if (ServerSpeedTestSub(testCounter, url) != 0) - { - return; - } + StartNext(); }; } - if (ServerSpeedTestSub(testCounter, url) != 0) + StartNext(); + + void StartNext() { - return; + if (testCounter >= _selecteds.Count) + { + if (pid > 0) _v2rayHandler.V2rayStopPid(pid); + return; + } + + int httpPort = _config.GetLocalPort("speedtest"); + int index = _selecteds[testCounter]; + + testCounter++; + WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + index); + downloadHandle2.DownloadFileAsync(url, webProxy, 20); } } - private int ServerSpeedTestSub(int index, string url) - { - if (index >= _selecteds.Count) - { - Global.reloadV2ray = true; - _v2rayHandler.LoadV2ray(_config); - return -1; - } - - int httpPort = _config.GetLocalPort("speedtest"); - index = _selecteds[index]; - - testCounter++; - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + index); - downloadHandle2.DownloadFileAsync(_config, url, webProxy, 20); - - return 0; - } private int GetTcpingTime(string url, int port) { diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index b4b629fc..9ea93933 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -27,8 +27,6 @@ namespace v2rayN.Handler /// public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg) { - msg = string.Empty; - try { //检查GUI设置 @@ -713,8 +711,6 @@ namespace v2rayN.Handler /// public static int GenerateClientCustomConfig(Config config, string fileName, out string msg) { - msg = string.Empty; - try { //检查GUI设置 @@ -768,8 +764,6 @@ namespace v2rayN.Handler /// public static int GenerateServerConfig(Config config, string fileName, out string msg) { - msg = string.Empty; - try { //检查GUI设置 @@ -1358,7 +1352,6 @@ namespace v2rayN.Handler /// public static int Export2ClientConfig(Config config, string fileName, out string msg) { - msg = string.Empty; return GenerateClientConfig(config, fileName, true, out msg); } @@ -1371,7 +1364,6 @@ namespace v2rayN.Handler /// public static int Export2ServerConfig(Config config, string fileName, out string msg) { - msg = string.Empty; return GenerateServerConfig(config, fileName, out msg); } @@ -1419,10 +1411,8 @@ namespace v2rayN.Handler #region Gen speedtest config - public static int GenerateClientSpeedtestConfig(Config config, List selecteds, string fileName, out string msg) + public static string GenerateClientSpeedtestConfigString(Config config, List selecteds, out string msg) { - msg = string.Empty; - try { if (config == null @@ -1432,7 +1422,7 @@ namespace v2rayN.Handler ) { msg = UIRes.I18N("CheckServerSettings"); - return -1; + return ""; } msg = UIRes.I18N("InitialConfiguration"); @@ -1443,20 +1433,21 @@ namespace v2rayN.Handler if (Utils.IsNullOrEmpty(result)) { msg = UIRes.I18N("FailedGetDefaultConfiguration"); - return -1; + return ""; } V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { msg = UIRes.I18N("FailedGenDefaultConfiguration"); - return -1; + return ""; } log(configCopy, ref v2rayConfig, false); //routing(config, ref v2rayConfig); dns(configCopy, ref v2rayConfig); + v2rayConfig.inbounds.RemoveAt(0); // Remove "proxy" service for speedtest, avoiding port conflicts. int httpPort = configCopy.GetLocalPort("speedtest"); foreach (int index in selecteds) @@ -1492,16 +1483,14 @@ namespace v2rayN.Handler v2rayConfig.routing.rules.Add(rule); } - Utils.ToJsonFile(v2rayConfig, fileName); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), configCopy.getSummary()); + return Utils.ToJson(v2rayConfig); } catch { msg = UIRes.I18N("FailedGenDefaultConfiguration"); - return -1; + return ""; } - return 0; } #endregion diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 5eeb411a..0ccdb651 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -28,9 +28,11 @@ namespace v2rayN.Handler public V2rayHandler() { - lstV2ray = new List(); - lstV2ray.Add("wv2ray"); - lstV2ray.Add("v2ray"); + lstV2ray = new List + { + "wv2ray", + "v2ray" + }; } /// @@ -40,9 +42,8 @@ namespace v2rayN.Handler { if (Global.reloadV2ray) { - string msg = string.Empty; string fileName = Utils.GetPath(v2rayConfigRes); - if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out msg) != 0) + if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) != 0) { ShowMsg(false, msg); } @@ -55,24 +56,25 @@ namespace v2rayN.Handler } /// - /// 载入V2ray + /// 新建进程,载入V2ray配置文件字符串 + /// 返回新进程pid。 /// - public void LoadV2ray(Config config, List _selecteds) + public int LoadV2rayConfigString(Config config, List _selecteds) { - if (Global.reloadV2ray) + int pid = -1; + string configStr = V2rayConfigHandler.GenerateClientSpeedtestConfigString(config, _selecteds, out string msg); + if (configStr == "") { - string msg = string.Empty; - string fileName = Utils.GetPath(v2rayConfigRes); - if (V2rayConfigHandler.GenerateClientSpeedtestConfig(config, _selecteds, fileName, out msg) != 0) - { - ShowMsg(false, msg); - } - else - { - ShowMsg(true, msg); - V2rayRestart(); - } + ShowMsg(false, msg); } + else + { + ShowMsg(true, msg); + pid = V2rayStartNew(configStr); + //V2rayRestart(); + // start with -config + } + return pid; } /// @@ -140,6 +142,43 @@ namespace v2rayN.Handler Utils.SaveLog(ex.Message, ex); } } + /// + /// V2ray停止 + /// + public void V2rayStopPid(int pid) + { + try + { + Process _p = Process.GetProcessById(pid); + KillProcess(_p); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private string V2rayFindexe() { + //查找v2ray文件是否存在 + string fileName = string.Empty; + lstV2ray.Reverse(); + foreach (string name in lstV2ray) + { + string vName = string.Format("{0}.exe", name); + vName = Utils.GetPath(vName); + if (File.Exists(vName)) + { + fileName = vName; + break; + } + } + if (Utils.IsNullOrEmpty(fileName)) + { + string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2ray/v2ray-core/releases"); + ShowMsg(true, msg); + } + return fileName; + } /// /// V2ray启动 @@ -150,32 +189,21 @@ namespace v2rayN.Handler try { - //查找v2ray文件是否存在 - string fileName = string.Empty; - foreach (string name in lstV2ray) - { - string vName = string.Format("{0}.exe", name); - vName = Utils.GetPath(vName); - if (File.Exists(vName)) - { - fileName = vName; - break; - } - } - if (Utils.IsNullOrEmpty(fileName)) - { - string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2ray/v2ray-core/releases"); - ShowMsg(true, msg); - return; - } + string fileName = V2rayFindexe(); + if (fileName == "") return; - Process p = new Process(); - p.StartInfo.FileName = fileName; - p.StartInfo.WorkingDirectory = Utils.StartupPath(); - p.StartInfo.UseShellExecute = false; - p.StartInfo.RedirectStandardOutput = true; - p.StartInfo.CreateNoWindow = true; - p.StartInfo.StandardOutputEncoding = Encoding.UTF8; + Process p = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = fileName, + WorkingDirectory = Utils.StartupPath(), + UseShellExecute = false, + RedirectStandardOutput = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8 + } + }; p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => { if (!String.IsNullOrEmpty(e.Data)) @@ -198,6 +226,57 @@ namespace v2rayN.Handler ShowMsg(true, msg); } } + /// + /// V2ray启动,新建进程,传入配置字符串 + /// + private int V2rayStartNew(string configStr) + { + ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString())); + + try + { + string fileName = V2rayFindexe(); + if (fileName == "") return -1; + + Process p = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = fileName, + Arguments = "-config stdin:", + WorkingDirectory = Utils.StartupPath(), + UseShellExecute = false, + RedirectStandardInput = true, + RedirectStandardOutput = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8 + } + }; + p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => + { + if (!String.IsNullOrEmpty(e.Data)) + { + string msg = e.Data + Environment.NewLine; + ShowMsg(false, msg); + } + }); + p.Start(); + p.BeginOutputReadLine(); + + p.StandardInput.Write(configStr); + p.StandardInput.Close(); + + Global.processJob.AddProcess(p.Handle); + return p.Id; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + string msg = ex.Message; + ShowMsg(true, msg); + return -1; + } + } /// /// 消息委托 diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs index 16f4cfef..23bf8087 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs @@ -172,8 +172,10 @@ namespace v2rayN.HttpProxyHandler } try { - List lstProxy = new List(); - lstProxy.Add(string.Format("PROXY {0}:{1};", address, port)); + List lstProxy = new List + { + string.Format("PROXY {0}:{1};", address, port) + }; string proxy = string.Join("", lstProxy.ToArray()); string strPacfile = Utils.GetPath(Global.pacFILE); diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index e0ef85ff..f41e36b1 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -384,10 +384,9 @@ namespace v2rayN.Mode public string getSummary() { - string summary = string.Empty; - summary = string.Format("{0}-", ((EConfigType)configType).ToString()); + string summary = string.Format("{0}-", ((EConfigType)configType).ToString()); string[] arrAddr = address.Split('.'); - string addr = string.Empty; + string addr; if (arrAddr.Length > 2) { addr = $"{arrAddr[0]}***{arrAddr[arrAddr.Length - 1]}"; diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index bd6e36d3..133e2108 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -1,6 +1,5 @@ using System; using System.Diagnostics; -using System.Reflection; using System.Threading; using System.Windows.Forms; using v2rayN.Forms; @@ -32,13 +31,11 @@ namespace v2rayN //AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; - Thread.Sleep(300); // 尽量避免切换语言后提示“已经运行” - Process instance = RunningInstance(); - if (instance == null) + if (!IsDuplicateInstance()) { if (!UnzipLibs()) { - UI.Show($"Error preparing the environment(准备运行环境出错)"); + UI.ShowError($"Error preparing the environment(准备运行环境出错)"); return; } @@ -54,7 +51,7 @@ namespace v2rayN } else { - UI.Show($"v2rayN is already running(v2rayN已经运行)"); + UI.ShowWarning($"v2rayN is already running(v2rayN已经运行)"); } } @@ -81,23 +78,17 @@ namespace v2rayN //} /// - /// 获取正在运行的实例,没有运行的实例返回null; + /// 检查是否已在运行 /// - public static Process RunningInstance() + public static bool IsDuplicateInstance() { - Process current = Process.GetCurrentProcess(); - Process[] processes = Process.GetProcessesByName(current.ProcessName); - foreach (Process process in processes) - { - if (process.Id != current.Id) - { - if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == process.MainModule.FileName) - { - return process; - } - } - } - return null; + //string name = "v2rayN"; + + string name = Utils.GetExePath(); // Allow different locations to run + name = name.Replace("\\", "/"); // https://stackoverflow.com/questions/20714120/could-not-find-a-part-of-the-path-error-while-creating-mutex + + Global.mutexObj = new Mutex(false, name, out bool bCreatedNew); + return !bCreatedNew; } static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 37de4210..87e444b3 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -7,9 +7,9 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle("v2rayN")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyCompany("")] [assembly: AssemblyProduct("v2rayN")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2020")] +[assembly: AssemblyCopyright("Copyright © 2019-2020 (GPLv3)")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index ae78335f..47a1fdd8 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -105,6 +105,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Downloading... 的本地化字符串。 + /// + internal static string Downloading { + get { + return ResourceManager.GetString("Downloading", resourceCulture); + } + } + /// /// 查找类似 DOWN 的本地化字符串。 /// @@ -492,6 +501,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Start updating {0}... 的本地化字符串。 + /// + internal static string MsgStartUpdating { + get { + return ResourceManager.GetString("MsgStartUpdating", resourceCulture); + } + } + /// /// 查找类似 Start updating PAC... 的本地化字符串。 /// @@ -501,15 +519,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 Start updating V2ray... 的本地化字符串。 - /// - internal static string MsgStartUpdatingV2rayCore { - get { - return ResourceManager.GetString("MsgStartUpdatingV2rayCore", resourceCulture); - } - } - /// /// 查找类似 Subscription content decoding failed (non-BASE64 code) 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 8718f93d..bfa63937 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -132,6 +132,9 @@ Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. + + Downloading... + DOWN @@ -264,8 +267,8 @@ Start updating PAC... - - Start updating V2ray... + + Start updating {0}... Subscription content decoding failed (non-BASE64 code) diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 7e8cab61..1adba146 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -132,6 +132,9 @@ 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。在自定义配置inbound中有socks port等于设置中的port时,系统代理才可用 + + 下载开始... + 下载 @@ -262,10 +265,10 @@ 开始获取订阅内容 - 开始更新PAC... + 开始更新 PAC... - - 开始更新V2ray... + + 开始更新 {0}... 订阅内容解码失败(非BASE64码) diff --git a/v2rayN/v2rayN/Tool/Job.cs b/v2rayN/v2rayN/Tool/Job.cs index 66bfb128..e2569b75 100644 --- a/v2rayN/v2rayN/Tool/Job.cs +++ b/v2rayN/v2rayN/Tool/Job.cs @@ -43,7 +43,6 @@ namespace v2rayN if (extendedInfoPtr != IntPtr.Zero) { Marshal.FreeHGlobal(extendedInfoPtr); - extendedInfoPtr = IntPtr.Zero; } } } diff --git a/v2rayN/v2rayN/Tool/UI.cs b/v2rayN/v2rayN/Tool/UI.cs index b6160d34..f2cabf75 100644 --- a/v2rayN/v2rayN/Tool/UI.cs +++ b/v2rayN/v2rayN/Tool/UI.cs @@ -8,10 +8,18 @@ namespace v2rayN { MessageBox.Show(msg, "v2rayN", MessageBoxButtons.OK, MessageBoxIcon.Information); } + public static void ShowWarning(string msg) + { + MessageBox.Show(msg, "v2rayN", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + public static void ShowError(string msg) + { + MessageBox.Show(msg, "v2rayN", MessageBoxButtons.OK, MessageBoxIcon.Error); + } public static DialogResult ShowYesNo(string msg) { - return MessageBox.Show(msg, "YesNo", MessageBoxButtons.YesNo); + return MessageBox.Show(msg, "v2rayN", MessageBoxButtons.YesNo, MessageBoxIcon.Question); } //public static string GetResourseString(string key) diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index f6f0bb3c..c92674bf 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -121,7 +121,7 @@ namespace v2rayN /// public static int ToJsonFile(Object obj, string filePath) { - int result = -1; + int result; try { using (StreamWriter file = File.CreateText(filePath)) @@ -485,24 +485,16 @@ namespace v2rayN /// /// /// - public static int SetAutoRun(bool run) + public static void SetAutoRun(bool run) { try { - if (run) - { - string exePath = GetExePath(); - RegWriteValue(autoRunRegPath, autoRunName, exePath); - } - else - { - RegWriteValue(autoRunRegPath, autoRunName, ""); - } + string exePath = GetExePath(); + RegWriteValue(autoRunRegPath, autoRunName, run ? exePath : ""); } catch { } - return 0; } /// @@ -551,15 +543,7 @@ namespace v2rayN public static string StartupPath() { - try - { - string exePath = GetExePath(); - return exePath.Substring(0, exePath.LastIndexOf("\\", StringComparison.Ordinal)); - } - catch - { - return Application.StartupPath; - } + return Application.StartupPath; } public static string RegReadValue(string path, string name, string def) @@ -625,7 +609,7 @@ namespace v2rayN long roundtripTime = -1; try { - int timeout = 120; + int timeout = 30; int echoNum = 2; Ping pingSender = new Ping(); for (int i = 0; i < echoNum; i++) @@ -883,7 +867,6 @@ namespace v2rayN public static string ScanScreen() { - string ret = string.Empty; try { foreach (Screen screen in Screen.AllScreens) @@ -921,7 +904,7 @@ namespace v2rayN Result result = reader.decode(bitmap); if (result != null) { - ret = result.Text; + string ret = result.Text; return ret; } } diff --git a/v2rayN/v2rayUpgrade/MainForm.Designer.cs b/v2rayN/v2rayUpgrade/MainForm.Designer.cs index f212a9a9..b9f9ad18 100644 --- a/v2rayN/v2rayUpgrade/MainForm.Designer.cs +++ b/v2rayN/v2rayUpgrade/MainForm.Designer.cs @@ -41,7 +41,7 @@ this.btnClose.Location = new System.Drawing.Point(367, 118); this.btnClose.Name = "btnClose"; this.btnClose.Size = new System.Drawing.Size(184, 89); - this.btnClose.TabIndex = 6; + this.btnClose.TabIndex = 1; this.btnClose.Text = "&Exit(退出)"; this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); @@ -52,7 +52,7 @@ this.btnOK.Location = new System.Drawing.Point(81, 118); this.btnOK.Name = "btnOK"; this.btnOK.Size = new System.Drawing.Size(184, 89); - this.btnOK.TabIndex = 7; + this.btnOK.TabIndex = 0; this.btnOK.Text = "&Upgrade(升级)"; this.btnOK.UseVisualStyleBackColor = true; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); @@ -89,7 +89,6 @@ this.Name = "MainForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "v2rayUpgrade"; - this.Load += new System.EventHandler(this.MainForm_Load); this.ResumeLayout(false); this.PerformLayout(); diff --git a/v2rayN/v2rayUpgrade/MainForm.cs b/v2rayN/v2rayUpgrade/MainForm.cs index 1bc22b7f..41990f42 100644 --- a/v2rayN/v2rayUpgrade/MainForm.cs +++ b/v2rayN/v2rayUpgrade/MainForm.cs @@ -8,28 +8,24 @@ namespace v2rayUpgrade { public partial class MainForm : Form { - private string[] _args; - private string _tempFileName = "v2rayUpgradeTemp.zip"; - + private readonly string defaultFilename = "v2ray-windows.zip"; + private string fileName; public MainForm(string[] args) { InitializeComponent(); - _args = args; + if (args.Length > 0) + { + fileName = args[0]; + } } - - private void MainForm_Load(object sender, EventArgs e) + private void showWarn(string message) { - + MessageBox.Show(message, "", MessageBoxButtons.OK, MessageBoxIcon.Warning); } private void btnOK_Click(object sender, EventArgs e) { - if (_args.Length <= 0) - { - return; - } - try { Process[] existing = Process.GetProcessesByName("v2rayN"); @@ -45,19 +41,24 @@ namespace v2rayUpgrade } catch (Exception ex) { - MessageBox.Show("Failed to close v2rayN(关闭v2rayN失败)." + ex.StackTrace); + showWarn("Failed to close v2rayN(关闭v2rayN失败)." + ex.StackTrace); return; } - string fileName = GetPath(_tempFileName); try { - File.Delete(fileName); - File.Copy(_args[0], fileName); + if (!File.Exists(fileName)) { - MessageBox.Show("Upgrade Failed, File Not Exist(升级失败,文件不存在)."); - return; + if (File.Exists(defaultFilename)) + { + fileName = defaultFilename; + } + else + { + showWarn("Upgrade Failed, File Not Exist(升级失败,文件不存在)."); + return; + } } string startKey = "v2rayN/"; @@ -86,23 +87,13 @@ namespace v2rayUpgrade } catch (Exception ex) { - MessageBox.Show("Upgrade Failed(升级失败)." + ex.StackTrace); + showWarn("Upgrade Failed(升级失败)." + ex.StackTrace); return; } - finally - { - File.Delete(fileName); - } - MessageBox.Show("Upgrade successed(升级成功)"); + Process.Start("v2rayN.exe"); + MessageBox.Show("Upgrade successed(升级成功)", "", MessageBoxButtons.OK, MessageBoxIcon.Information); - try - { - Process.Start("v2rayN.exe"); - } - catch - { - } Close(); } @@ -118,15 +109,7 @@ namespace v2rayUpgrade public static string StartupPath() { - try - { - string exePath = GetExePath(); - return exePath.Substring(0, exePath.LastIndexOf("\\", StringComparison.Ordinal)); - } - catch - { - return Application.StartupPath; - } + return Application.StartupPath; } public static string GetPath(string fileName) { diff --git a/v2rayN/v2rayUpgrade/Program.cs b/v2rayN/v2rayUpgrade/Program.cs index c7971134..f35e72a4 100644 --- a/v2rayN/v2rayUpgrade/Program.cs +++ b/v2rayN/v2rayUpgrade/Program.cs @@ -11,12 +11,6 @@ namespace v2rayUpgrade [STAThread] static void Main(string[] args) { - if (args.Length <= 0) - { - MessageBox.Show("Please use v2rayN to upgrade(请用v2rayN升级)"); - return; - } - Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm(args)); diff --git a/v2rayN/v2rayUpgrade/Properties/AssemblyInfo.cs b/v2rayN/v2rayUpgrade/Properties/AssemblyInfo.cs index 654bd7b5..b0e6d5c3 100644 --- a/v2rayN/v2rayUpgrade/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayUpgrade/Properties/AssemblyInfo.cs @@ -9,7 +9,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("v2rayUpgrade")] -[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyCopyright("Copyright © 2019-2020 (GPLv3)")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -31,5 +31,4 @@ using System.Runtime.InteropServices; // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 // 方法是按如下所示使用“*”: : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.1.0.0")]