Merge pull request #453 from yfdyh000/misc-pr1

UI 为主的琐碎优化
pull/524/head
2dust 2020-03-09 10:44:22 +08:00 committed by GitHub
commit 3d6afe50e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 490 additions and 411 deletions

View File

@ -107,6 +107,7 @@
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.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
this.tsbHelp = new System.Windows.Forms.ToolStripDropDownButton();
@ -117,7 +118,7 @@
this.tsbPromotion = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
this.tsbClose = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator();
this.tsbV2rayWebsite = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
@ -162,7 +163,7 @@
this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged);
this.lvServers.Click += new System.EventHandler(this.lvServers_Click);
this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick);
this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown);
this.lvServers.KeyUp += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyUp);
//
// cmsLv
//
@ -196,7 +197,6 @@
this.menuExport2ShareUrl,
this.menuExport2SubContent});
this.cmsLv.Name = "cmsLv";
this.cmsLv.OwnerItem = this.tsbServer;
resources.ApplyResources(this.cmsLv, "cmsLv");
//
// menuAddVmessServer
@ -684,6 +684,11 @@
resources.ApplyResources(this.tsbCheckUpdatePACList, "tsbCheckUpdatePACList");
this.tsbCheckUpdatePACList.Click += new System.EventHandler(this.tsbCheckUpdatePACList_Click);
//
// toolStripSeparator13
//
this.toolStripSeparator13.Name = "toolStripSeparator13";
resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13");
//
// tsbCheckClearPACList
//
this.tsbCheckClearPACList.Name = "tsbCheckClearPACList";
@ -698,6 +703,7 @@
// tsbHelp
//
this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbV2rayWebsite,
this.tsbAbout,
this.toolStripSeparator12,
this.tsbLanguageDef,
@ -748,10 +754,11 @@
this.tsbClose.Name = "tsbClose";
this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click);
//
// toolStripSeparator13
// tsbV2rayWebsite
//
this.toolStripSeparator13.Name = "toolStripSeparator13";
resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13");
this.tsbV2rayWebsite.Name = "tsbV2rayWebsite";
resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite");
this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click);
//
// MainForm
//
@ -877,6 +884,7 @@
private System.Windows.Forms.ToolStripMenuItem menuRealPingServer;
private System.Windows.Forms.ToolStripMenuItem menuNotEnabledHttp;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator13;
private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite;
}
}

View File

@ -167,10 +167,10 @@ namespace v2rayN.Forms
if (statistics != null && statistics.Enable)
{
lvServers.Columns.Add(UIRes.I18N("LvTotalUploadDataAmount"), 70, HorizontalAlignment.Left);
lvServers.Columns.Add(UIRes.I18N("LvTotalDownloadDataAmount"), 70, HorizontalAlignment.Left);
lvServers.Columns.Add(UIRes.I18N("LvTodayUploadDataAmount"), 70, HorizontalAlignment.Left);
lvServers.Columns.Add(UIRes.I18N("LvTodayDownloadDataAmount"), 70, HorizontalAlignment.Left);
lvServers.Columns.Add(UIRes.I18N("LvTodayUploadDataAmount"), 70, HorizontalAlignment.Left);
lvServers.Columns.Add(UIRes.I18N("LvTotalDownloadDataAmount"), 70, HorizontalAlignment.Left);
lvServers.Columns.Add(UIRes.I18N("LvTotalUploadDataAmount"), 70, HorizontalAlignment.Left);
}
}
@ -198,13 +198,13 @@ namespace v2rayN.Forms
ListViewItem lvItem = null;
if (statistics != null && statistics.Enable)
{
var index = statistics.Statistic.FindIndex(item_ => item_.itemId == item.getItemId());
if (index != -1)
var sItem = statistics.Statistic.Find(item_ => item_.itemId == item.getItemId());
if (sItem != null)
{
totalUp = Utils.HumanFy(statistics.Statistic[index].totalUp);
totalDown = Utils.HumanFy(statistics.Statistic[index].totalDown);
todayUp = Utils.HumanFy(statistics.Statistic[index].todayUp);
todayDown = Utils.HumanFy(statistics.Statistic[index].todayDown);
totalUp = Utils.HumanFy(sItem.totalUp);
totalDown = Utils.HumanFy(sItem.totalDown);
todayUp = Utils.HumanFy(sItem.todayUp);
todayDown = Utils.HumanFy(sItem.todayDown);
}
lvItem = new ListViewItem(new string[]
@ -220,10 +220,10 @@ namespace v2rayN.Forms
item.network,
item.getSubRemarks(config),
item.testResult,
totalUp,
totalDown,
todayDown,
todayUp,
todayDown
totalDown,
totalUp
});
}
else
@ -241,10 +241,6 @@ namespace v2rayN.Forms
item.network,
item.getSubRemarks(config),
item.testResult
//totalUp,
//totalDown,
//todayUp,
//todayDown,
});
}
@ -324,7 +320,7 @@ namespace v2rayN.Forms
{
toolSslSocksPort.Text =
toolSslHttpPort.Text =
toolSslPacPort.Text = "NONE";
toolSslPacPort.Text = "OFF";
toolSslSocksPort.Text = $"{Global.Loopback}:{config.inbound[0].localPort}";
@ -468,7 +464,7 @@ namespace v2rayN.Forms
}
}
private void lvServers_KeyDown(object sender, KeyEventArgs e)
private void lvServers_KeyUp(object sender, KeyEventArgs e)
{
if (e.Control)
{
@ -477,6 +473,18 @@ namespace v2rayN.Forms
case Keys.A:
menuSelectAll_Click(null, null);
break;
case Keys.C:
menuExport2ShareUrl_Click(null, null);
break;
case Keys.V:
menuAddServers_Click(null, null);
break;
case Keys.U:
menuMoveTop_Click(null, null);
break;
case Keys.D:
menuMoveBottom_Click(null, null);
break;
case Keys.P:
menuPingServer_Click(null, null);
break;
@ -491,20 +499,23 @@ namespace v2rayN.Forms
break;
}
}
switch (e.KeyCode)
else
{
case Keys.Enter:
menuSetDefaultServer_Click(null, null);
break;
case Keys.Delete:
menuRemoveServer_Click(null, null);
break;
case Keys.U:
menuMoveUp_Click(null, null);
break;
case Keys.D:
menuMoveDown_Click(null, null);
break;
switch (e.KeyCode)
{
case Keys.Enter:
menuSetDefaultServer_Click(null, null);
break;
case Keys.Delete:
menuRemoveServer_Click(null, null);
break;
case Keys.U:
menuMoveUp_Click(null, null);
break;
case Keys.D:
menuMoveDown_Click(null, null);
break;
}
}
}
@ -546,6 +557,8 @@ namespace v2rayN.Forms
{
List<Mode.VmessItem> servers = null;
Utils.DedupServerList(config.vmess, out servers);
int oldCount = config.vmess.Count;
int newCount = servers.Count;
if (servers != null)
{
config.vmess = servers;
@ -553,6 +566,7 @@ namespace v2rayN.Forms
//刷新
RefreshServers();
LoadV2ray();
UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount));
}
private void menuCopyServer_Click(object sender, EventArgs e)
@ -638,9 +652,9 @@ namespace v2rayN.Forms
GetLvSelectedIndex();
StringBuilder sb = new StringBuilder();
for (int k = 0; k < lvSelecteds.Count; k++)
foreach (int v in lvSelecteds)
{
string url = ConfigHandler.GetVmessQRCode(config, lvSelecteds[k]);
string url = ConfigHandler.GetVmessQRCode(config, v);
if (Utils.IsNullOrEmpty(url))
{
continue;
@ -660,9 +674,9 @@ namespace v2rayN.Forms
GetLvSelectedIndex();
StringBuilder sb = new StringBuilder();
for (int k = 0; k < lvSelecteds.Count; k++)
foreach (int v in lvSelecteds)
{
string url = ConfigHandler.GetVmessQRCode(config, lvSelecteds[k]);
string url = ConfigHandler.GetVmessQRCode(config, v);
if (Utils.IsNullOrEmpty(url))
{
continue;
@ -809,9 +823,10 @@ namespace v2rayN.Forms
private void menuAddServers_Click(object sender, EventArgs e)
{
string clipboardData = Utils.GetClipboardData();
if (AddBatchServers(clipboardData) == 0)
int result = AddBatchServers(clipboardData);
if (result > 0)
{
UI.Show(UIRes.I18N("SuccessfullyImportedServerViaClipboard"));
UI.Show(string.Format(UIRes.I18N("SuccessfullyImportedServerViaClipboard"), result));
}
}
@ -823,16 +838,19 @@ namespace v2rayN.Forms
private int AddBatchServers(string clipboardData, string subid = "")
{
if (ConfigHandler.AddBatchServers(ref config, clipboardData, subid) != 0)
int counter;
int _Add()
{
return ConfigHandler.AddBatchServers(ref config, clipboardData, subid);
}
counter = _Add();
if (counter < 1)
{
clipboardData = Utils.Base64Decode(clipboardData);
if (ConfigHandler.AddBatchServers(ref config, clipboardData, subid) != 0)
{
return -1;
}
counter = _Add();
}
RefreshServers();
return 0;
return counter;
}
#endregion
@ -970,9 +988,9 @@ namespace v2rayN.Forms
}
private void ClearTestResult()
{
for (int k = 0; k < lvSelecteds.Count; k++)
foreach (int s in lvSelecteds)
{
SetTestResult(lvSelecteds[k], "");
SetTestResult(s, "");
}
}
private void UpdateSpeedtestHandler(int index, string msg)
@ -1006,10 +1024,10 @@ namespace v2rayN.Forms
lvServers.SuspendLayout();
var indexStart = 9;
lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].totalUp);
lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].totalDown);
lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].todayUp);
lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].todayDown);
lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].todayUp);
lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].totalDown);
lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].totalUp);
lvServers.ResumeLayout();
});
@ -1056,7 +1074,7 @@ namespace v2rayN.Forms
}
if (ConfigHandler.MoveServer(ref config, index, eMove) == 0)
{
//刷新
//TODO: reload is not good.
RefreshServers();
LoadV2ray();
}
@ -1199,7 +1217,7 @@ namespace v2rayN.Forms
}
AppendText(false, UIRes.I18N("MsgStartUpdatingV2rayCore"));
downloadHandle.AbsoluteV2rayN(config);
downloadHandle.CheckUpdateAsync("v2rayN");
}
private void tsbCheckUpdateCore_Click(object sender, EventArgs e)
@ -1272,7 +1290,7 @@ namespace v2rayN.Forms
}
AppendText(false, UIRes.I18N("MsgStartUpdatingV2rayCore"));
downloadHandle.AbsoluteV2rayCore(config);
downloadHandle.CheckUpdateAsync("Core");
}
private void tsbCheckUpdatePACList_Click(object sender, EventArgs e)
@ -1356,7 +1374,7 @@ namespace v2rayN.Forms
}
else
{
if (AddBatchServers(result) == 0)
if (AddBatchServers(result) > 0)
{
UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan"));
}
@ -1416,7 +1434,7 @@ namespace v2rayN.Forms
ConfigHandler.RemoveServerViaSubid(ref config, id);
AppendText(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}");
RefreshServers();
if (AddBatchServers(result, id) == 0)
if (AddBatchServers(result, id) > 0)
{
}
else
@ -1456,10 +1474,15 @@ namespace v2rayN.Forms
private void SetCurrentLanguage(string value)
{
Utils.RegWriteValue(Global.MyRegPath, Global.MyRegKeyLanguage, value);
Application.Restart();
}
#endregion
private void tsbV2rayWebsite_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(Global.v2rayWebsiteUrl);
}
}
}

View File

@ -156,7 +156,7 @@
<value>447, 22</value>
</data>
<data name="menuAddServers.Text" xml:space="preserve">
<value>Import bulk URL from clipboard</value>
<value>Import bulk URL from clipboard (Ctrl+V)</value>
</data>
<data name="menuScanScreen.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
@ -171,19 +171,19 @@
<value>447, 22</value>
</data>
<data name="menuRemoveServer.Text" xml:space="preserve">
<value>Remove selected server (multiple choice) (Delete)</value>
<value>Remove selected servers (Delete)</value>
</data>
<data name="menuRemoveDuplicateServer.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
</data>
<data name="menuRemoveDuplicateServer.Text" xml:space="preserve">
<value>Remove duplicate server</value>
<value>Remove duplicate servers</value>
</data>
<data name="menuCopyServer.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
</data>
<data name="menuCopyServer.Text" xml:space="preserve">
<value>Copy selected server</value>
<value>Clone selected server</value>
</data>
<data name="menuSetDefaultServer.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
@ -198,7 +198,7 @@
<value>447, 22</value>
</data>
<data name="menuMoveTop.Text" xml:space="preserve">
<value>Up to top</value>
<value>Move to top (Ctrl+U)</value>
</data>
<data name="menuMoveUp.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
@ -216,7 +216,7 @@
<value>447, 22</value>
</data>
<data name="menuMoveBottom.Text" xml:space="preserve">
<value>Moves down to the bottom</value>
<value>Move to bottom (Ctrl+D)</value>
</data>
<data name="menuSelectAll.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
@ -231,25 +231,25 @@
<value>447, 22</value>
</data>
<data name="menuPingServer.Text" xml:space="preserve">
<value>Test server ping (multiple choice)(Ctrl+P)</value>
<value>Test servers ping (Ctrl+P)</value>
</data>
<data name="menuTcpingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
</data>
<data name="menuTcpingServer.Text" xml:space="preserve">
<value>Test server tcping (multiple choice)(Ctrl+O)</value>
<value>Test servers with tcping (Ctrl+O)</value>
</data>
<data name="menuRealPingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
</data>
<data name="menuRealPingServer.Text" xml:space="preserve">
<value>Test server real ping (multiple choice)(Ctrl+R)</value>
<value>Test servers real delay (Ctrl+R)</value>
</data>
<data name="menuSpeedServer.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
</data>
<data name="menuSpeedServer.Text" xml:space="preserve">
<value>Test server speed (multiple choice)(Ctrl+T)</value>
<value>Test servers download speed (Ctrl+T)</value>
</data>
<data name="toolStripSeparator6.Size" type="System.Drawing.Size, System.Drawing">
<value>444, 6</value>
@ -270,13 +270,13 @@
<value>447, 22</value>
</data>
<data name="menuExport2ShareUrl.Text" xml:space="preserve">
<value>Batch export share URL to clipboard (multiple choice)</value>
<value>Export share URLs to clipboard (Ctrl+C)</value>
</data>
<data name="menuExport2SubContent.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
</data>
<data name="menuExport2SubContent.Text" xml:space="preserve">
<value>Batch export subscription content to clipboard (multiple choice)</value>
<value>Export subscription (base64) share to clipboard</value>
</data>
<data name="tsbServer.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
<value>Magenta</value>
@ -291,7 +291,7 @@
<value>ImageAboveText</value>
</data>
<data name="cmsLv.Size" type="System.Drawing.Size, System.Drawing">
<value>448, 534</value>
<value>448, 556</value>
</data>
<data name="&gt;&gt;cmsLv.Name" xml:space="preserve">
<value>cmsLv</value>
@ -422,27 +422,6 @@
<data name="cmsMain.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="cmsMain.Size" type="System.Drawing.Size, System.Drawing">
<value>265, 142</value>
</data>
<data name="&gt;&gt;cmsMain.Name" xml:space="preserve">
<value>cmsMain</value>
</data>
<data name="&gt;&gt;cmsMain.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="notifyMain.Text" xml:space="preserve">
<value>v2rayN</value>
</data>
<data name="notifyMain.Visible" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="menuSysAgentMode.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 22</value>
</data>
<data name="menuSysAgentMode.Text" xml:space="preserve">
<value>Http proxy</value>
</data>
<data name="menuNotEnabledHttp.Size" type="System.Drawing.Size, System.Drawing">
<value>547, 22</value>
</data>
@ -473,6 +452,12 @@
<data name="menuKeepPAC.Text" xml:space="preserve">
<value>Only open PAC, do not automatically configure PAC</value>
</data>
<data name="menuSysAgentMode.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 22</value>
</data>
<data name="menuSysAgentMode.Text" xml:space="preserve">
<value>Http proxy</value>
</data>
<data name="menuServers.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 22</value>
</data>
@ -506,6 +491,21 @@
<data name="menuExit.Text" xml:space="preserve">
<value>Exit</value>
</data>
<data name="cmsMain.Size" type="System.Drawing.Size, System.Drawing">
<value>265, 142</value>
</data>
<data name="&gt;&gt;cmsMain.Name" xml:space="preserve">
<value>cmsMain</value>
</data>
<data name="&gt;&gt;cmsMain.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="notifyMain.Text" xml:space="preserve">
<value>v2rayN</value>
</data>
<data name="notifyMain.Visible" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<metadata name="bgwScan.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>498, 17</value>
</metadata>
@ -522,7 +522,7 @@
<value>2</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Server list</value>
<value>Servers list</value>
</data>
<data name="&gt;&gt;groupBox1.Name" xml:space="preserve">
<value>groupBox1</value>
@ -536,60 +536,6 @@
<data name="&gt;&gt;groupBox1.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<metadata name="ssMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>228, 18</value>
</metadata>
<data name="&gt;&gt;txtMsgBox.Name" xml:space="preserve">
<value>txtMsgBox</value>
</data>
<data name="&gt;&gt;txtMsgBox.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;txtMsgBox.Parent" xml:space="preserve">
<value>groupBox2</value>
</data>
<data name="&gt;&gt;txtMsgBox.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;ssMain.Name" xml:space="preserve">
<value>ssMain</value>
</data>
<data name="&gt;&gt;ssMain.Type" xml:space="preserve">
<value>System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ssMain.Parent" xml:space="preserve">
<value>groupBox2</value>
</data>
<data name="&gt;&gt;ssMain.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="groupBox2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<data name="groupBox2.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 417</value>
</data>
<data name="groupBox2.Size" type="System.Drawing.Size, System.Drawing">
<value>952, 176</value>
</data>
<data name="groupBox2.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="groupBox2.Text" xml:space="preserve">
<value>Information</value>
</data>
<data name="&gt;&gt;groupBox2.Name" xml:space="preserve">
<value>groupBox2</value>
</data>
<data name="&gt;&gt;groupBox2.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;groupBox2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;groupBox2.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="txtMsgBox.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
@ -626,6 +572,81 @@
<metadata name="ssMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>228, 18</value>
</metadata>
<data name="toolSslSocksPortLab.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslSocksPortLab.Size" type="System.Drawing.Size, System.Drawing">
<value>52, 17</value>
</data>
<data name="toolSslSocksPortLab.Text" xml:space="preserve">
<value>SOCKS5:</value>
</data>
<data name="toolSslSocksPort.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 17</value>
</data>
<data name="toolSslBlank1.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslBlank1.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 17</value>
</data>
<data name="toolSslHttpPortLab.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslHttpPortLab.Size" type="System.Drawing.Size, System.Drawing">
<value>39, 17</value>
</data>
<data name="toolSslHttpPortLab.Text" xml:space="preserve">
<value>HTTP:</value>
</data>
<data name="toolSslHttpPort.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 17</value>
</data>
<data name="toolSslBlank2.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslBlank2.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 17</value>
</data>
<data name="toolSslPacPortLab.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslPacPortLab.Size" type="System.Drawing.Size, System.Drawing">
<value>33, 17</value>
</data>
<data name="toolSslPacPortLab.Text" xml:space="preserve">
<value>PAC:</value>
</data>
<data name="toolSslPacPort.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 17</value>
</data>
<data name="toolSslBlank3.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslBlank3.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 17</value>
</data>
<data name="toolSslServerSpeed.AutoSize" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="toolSslServerSpeed.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslServerSpeed.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>No</value>
</data>
<data name="toolSslServerSpeed.Size" type="System.Drawing.Size, System.Drawing">
<value>220, 17</value>
</data>
<data name="toolSslServerSpeed.Text" xml:space="preserve">
<value>SPEED Disabled</value>
</data>
<data name="toolSslServerSpeed.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="toolSslBlank4.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 17</value>
</data>
<data name="ssMain.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 151</value>
</data>
@ -650,80 +671,32 @@
<data name="&gt;&gt;ssMain.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="toolSslSocksPortLab.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
<data name="groupBox2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<data name="toolSslSocksPortLab.Size" type="System.Drawing.Size, System.Drawing">
<value>49, 17</value>
<data name="groupBox2.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 417</value>
</data>
<data name="toolSslSocksPortLab.Text" xml:space="preserve">
<value>SOCKS5</value>
<data name="groupBox2.Size" type="System.Drawing.Size, System.Drawing">
<value>952, 176</value>
</data>
<data name="toolSslSocksPort.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 17</value>
<data name="groupBox2.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="toolSslBlank1.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
<data name="groupBox2.Text" xml:space="preserve">
<value>Informations</value>
</data>
<data name="toolSslBlank1.Size" type="System.Drawing.Size, System.Drawing">
<value>198, 17</value>
<data name="&gt;&gt;groupBox2.Name" xml:space="preserve">
<value>groupBox2</value>
</data>
<data name="toolSslHttpPortLab.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
<data name="&gt;&gt;groupBox2.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="toolSslHttpPortLab.Size" type="System.Drawing.Size, System.Drawing">
<value>36, 17</value>
<data name="&gt;&gt;groupBox2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="toolSslHttpPortLab.Text" xml:space="preserve">
<value>HTTP</value>
</data>
<data name="toolSslHttpPort.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 17</value>
</data>
<data name="toolSslBlank2.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslBlank2.Size" type="System.Drawing.Size, System.Drawing">
<value>198, 17</value>
</data>
<data name="toolSslPacPortLab.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslPacPortLab.Size" type="System.Drawing.Size, System.Drawing">
<value>30, 17</value>
</data>
<data name="toolSslPacPortLab.Text" xml:space="preserve">
<value>PAC</value>
</data>
<data name="toolSslPacPort.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 17</value>
</data>
<data name="toolSslBlank3.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslBlank3.Size" type="System.Drawing.Size, System.Drawing">
<value>198, 17</value>
</data>
<data name="toolSslServerSpeed.AutoSize" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="toolSslServerSpeed.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
</data>
<data name="toolSslServerSpeed.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>No</value>
</data>
<data name="toolSslServerSpeed.Size" type="System.Drawing.Size, System.Drawing">
<value>220, 17</value>
</data>
<data name="toolSslServerSpeed.Text" xml:space="preserve">
<value>SPEED Disabled</value>
</data>
<data name="toolSslServerSpeed.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="toolSslBlank4.Size" type="System.Drawing.Size, System.Drawing">
<value>0, 17</value>
<data name="&gt;&gt;groupBox2.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
@ -755,14 +728,26 @@
<data name="toolStripSeparator4.Size" type="System.Drawing.Size, System.Drawing">
<value>6, 56</value>
</data>
<data name="tsbSubSetting.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 22</value>
</data>
<data name="tsbSubSetting.Text" xml:space="preserve">
<value>Settings</value>
</data>
<data name="tsbSubUpdate.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 22</value>
</data>
<data name="tsbSubUpdate.Text" xml:space="preserve">
<value>Updates</value>
</data>
<data name="tsbSub.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
<value>Magenta</value>
</data>
<data name="tsbSub.Size" type="System.Drawing.Size, System.Drawing">
<value>93, 53</value>
<value>99, 53</value>
</data>
<data name="tsbSub.Text" xml:space="preserve">
<value>Subscription</value>
<value>Subscriptions</value>
</data>
<data name="tsbSub.TextImageRelation" type="System.Windows.Forms.TextImageRelation, System.Windows.Forms">
<value>ImageAboveText</value>
@ -774,10 +759,10 @@
<value>Magenta</value>
</data>
<data name="tsbOptionSetting.Size" type="System.Drawing.Size, System.Drawing">
<value>52, 53</value>
<value>58, 53</value>
</data>
<data name="tsbOptionSetting.Text" xml:space="preserve">
<value>Setting</value>
<value>Settings</value>
</data>
<data name="tsbOptionSetting.TextImageRelation" type="System.Windows.Forms.TextImageRelation, System.Windows.Forms">
<value>ImageAboveText</value>
@ -803,10 +788,10 @@
<value>Magenta</value>
</data>
<data name="tsbReload.Size" type="System.Drawing.Size, System.Drawing">
<value>97, 53</value>
<value>98, 53</value>
</data>
<data name="tsbReload.Text" xml:space="preserve">
<value>Restart service</value>
<value>Restart Service</value>
</data>
<data name="tsbReload.TextImageRelation" type="System.Windows.Forms.TextImageRelation, System.Windows.Forms">
<value>ImageAboveText</value>
@ -815,31 +800,31 @@
<value>6, 56</value>
</data>
<data name="tsbCheckUpdateN.Size" type="System.Drawing.Size, System.Drawing">
<value>338, 22</value>
<value>393, 22</value>
</data>
<data name="tsbCheckUpdateN.Text" xml:space="preserve">
<value>Check for updates to v2rayN</value>
<value>v2rayN (this software)</value>
</data>
<data name="tsbCheckUpdateCore.Size" type="System.Drawing.Size, System.Drawing">
<value>338, 22</value>
<value>393, 22</value>
</data>
<data name="tsbCheckUpdateCore.Text" xml:space="preserve">
<value>Check for updates to v2rayCore</value>
<value>Update v2rayCore</value>
</data>
<data name="tsbCheckUpdatePACList.Size" type="System.Drawing.Size, System.Drawing">
<value>338, 22</value>
<value>393, 22</value>
</data>
<data name="tsbCheckUpdatePACList.Text" xml:space="preserve">
<value>Check for updated PAC (requires Http proxy)</value>
<value>Check for updated PAC (need the HTTP proxy are ON)</value>
</data>
<data name="toolStripSeparator13.Size" type="System.Drawing.Size, System.Drawing">
<value>335, 6</value>
<value>390, 6</value>
</data>
<data name="tsbCheckClearPACList.Size" type="System.Drawing.Size, System.Drawing">
<value>338, 22</value>
<value>393, 22</value>
</data>
<data name="tsbCheckClearPACList.Text" xml:space="preserve">
<value>Simplify PAC (please set Core route)</value>
<value>Simplify PAC (need to set Core route)</value>
</data>
<data name="tsbCheckUpdate.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
<value>Magenta</value>
@ -856,6 +841,33 @@
<data name="toolStripSeparator10.Size" type="System.Drawing.Size, System.Drawing">
<value>6, 56</value>
</data>
<data name="tsbV2rayWebsite.Size" type="System.Drawing.Size, System.Drawing">
<value>187, 22</value>
</data>
<data name="tsbV2rayWebsite.Text" xml:space="preserve">
<value>V2Ray Website</value>
</data>
<data name="tsbAbout.Size" type="System.Drawing.Size, System.Drawing">
<value>187, 22</value>
</data>
<data name="tsbAbout.Text" xml:space="preserve">
<value>v2rayN Project</value>
</data>
<data name="toolStripSeparator12.Size" type="System.Drawing.Size, System.Drawing">
<value>184, 6</value>
</data>
<data name="tsbLanguageDef.Size" type="System.Drawing.Size, System.Drawing">
<value>187, 22</value>
</data>
<data name="tsbLanguageDef.Text" xml:space="preserve">
<value>Language-[English]</value>
</data>
<data name="tsbLanguageZhHans.Size" type="System.Drawing.Size, System.Drawing">
<value>187, 22</value>
</data>
<data name="tsbLanguageZhHans.Text" xml:space="preserve">
<value>语言-[中文简体]</value>
</data>
<data name="tsbHelp.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
<value>Magenta</value>
</data>
@ -923,39 +935,6 @@
<data name="&gt;&gt;tsMain.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="tsbSubSetting.Size" type="System.Drawing.Size, System.Drawing">
<value>197, 22</value>
</data>
<data name="tsbSubSetting.Text" xml:space="preserve">
<value>Subscription settings</value>
</data>
<data name="tsbSubUpdate.Size" type="System.Drawing.Size, System.Drawing">
<value>197, 22</value>
</data>
<data name="tsbSubUpdate.Text" xml:space="preserve">
<value>Update subscription</value>
</data>
<data name="tsbAbout.Size" type="System.Drawing.Size, System.Drawing">
<value>187, 22</value>
</data>
<data name="tsbAbout.Text" xml:space="preserve">
<value>About</value>
</data>
<data name="toolStripSeparator12.Size" type="System.Drawing.Size, System.Drawing">
<value>184, 6</value>
</data>
<data name="tsbLanguageDef.Size" type="System.Drawing.Size, System.Drawing">
<value>187, 22</value>
</data>
<data name="tsbLanguageDef.Text" xml:space="preserve">
<value>Language-[English]</value>
</data>
<data name="tsbLanguageZhHans.Size" type="System.Drawing.Size, System.Drawing">
<value>187, 22</value>
</data>
<data name="tsbLanguageZhHans.Text" xml:space="preserve">
<value>语言-[中文简体]</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
@ -1370,6 +1349,12 @@
<data name="&gt;&gt;tsbCheckUpdatePACList.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator13.Name" xml:space="preserve">
<value>toolStripSeparator13</value>
</data>
<data name="&gt;&gt;toolStripSeparator13.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tsbCheckClearPACList.Name" xml:space="preserve">
<value>tsbCheckClearPACList</value>
</data>
@ -1430,11 +1415,11 @@
<data name="&gt;&gt;tsbClose.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator13.Name" xml:space="preserve">
<value>toolStripSeparator13</value>
<data name="&gt;&gt;tsbV2rayWebsite.Name" xml:space="preserve">
<value>tsbV2rayWebsite</value>
</data>
<data name="&gt;&gt;toolStripSeparator13.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;tsbV2rayWebsite.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>MainForm</value>

View File

@ -146,7 +146,7 @@
<value>278, 22</value>
</data>
<data name="menuAddServers.Text" xml:space="preserve">
<value>从剪贴板导入批量URL</value>
<value>从剪贴板导入批量URL (Ctrl+V)</value>
</data>
<data name="menuScanScreen.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
@ -161,7 +161,7 @@
<value>278, 22</value>
</data>
<data name="menuRemoveServer.Text" xml:space="preserve">
<value>移除所选服务器(多选) (Delete)</value>
<value>移除所选服务器(多选) (Delete)</value>
</data>
<data name="menuRemoveDuplicateServer.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
@ -173,13 +173,13 @@
<value>278, 22</value>
</data>
<data name="menuCopyServer.Text" xml:space="preserve">
<value>复制所选服务器</value>
<value>克隆所选服务器</value>
</data>
<data name="menuSetDefaultServer.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
</data>
<data name="menuSetDefaultServer.Text" xml:space="preserve">
<value>设为活动服务器 (Enter)</value>
<value>设为活动服务器 (Enter)</value>
</data>
<data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
<value>275, 6</value>
@ -188,31 +188,31 @@
<value>278, 22</value>
</data>
<data name="menuMoveTop.Text" xml:space="preserve">
<value>上移至顶</value>
<value>上移至顶 (Ctrl+U)</value>
</data>
<data name="menuMoveUp.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
</data>
<data name="menuMoveUp.Text" xml:space="preserve">
<value>上移 (U)</value>
<value>上移 (U)</value>
</data>
<data name="menuMoveDown.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
</data>
<data name="menuMoveDown.Text" xml:space="preserve">
<value>下移 (D)</value>
<value>下移 (D)</value>
</data>
<data name="menuMoveBottom.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
</data>
<data name="menuMoveBottom.Text" xml:space="preserve">
<value>下移至底</value>
<value>下移至底 (Ctrl+D)</value>
</data>
<data name="menuSelectAll.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
</data>
<data name="menuSelectAll.Text" xml:space="preserve">
<value>全选 (Ctrl+A)</value>
<value>全选 (Ctrl+A)</value>
</data>
<data name="toolStripSeparator9.Size" type="System.Drawing.Size, System.Drawing">
<value>275, 6</value>
@ -221,25 +221,25 @@
<value>278, 22</value>
</data>
<data name="menuPingServer.Text" xml:space="preserve">
<value>测试服务器延迟Ping(多选)(Ctrl+P)</value>
<value>测试服务器延迟Ping(多选) (Ctrl+P)</value>
</data>
<data name="menuTcpingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
</data>
<data name="menuTcpingServer.Text" xml:space="preserve">
<value>测试服务器延迟Tcping(多选)(Ctrl+O)</value>
<value>测试服务器延迟Tcping(多选) (Ctrl+O)</value>
</data>
<data name="menuRealPingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
</data>
<data name="menuRealPingServer.Text" xml:space="preserve">
<value>测试服务器真连接延迟(多选)(Ctrl+R)</value>
<value>测试服务器真连接延迟(多选) (Ctrl+R)</value>
</data>
<data name="menuSpeedServer.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
</data>
<data name="menuSpeedServer.Text" xml:space="preserve">
<value>测试服务器速度(多选)(Ctrl+T)</value>
<value>测试服务器速度(多选) (Ctrl+T)</value>
</data>
<data name="toolStripSeparator6.Size" type="System.Drawing.Size, System.Drawing">
<value>275, 6</value>
@ -260,7 +260,7 @@
<value>278, 22</value>
</data>
<data name="menuExport2ShareUrl.Text" xml:space="preserve">
<value>批量导出分享URL至剪贴板(多选)</value>
<value>批量导出分享URL至剪贴板(多选) (Ctrl+C)</value>
</data>
<data name="menuExport2SubContent.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 22</value>
@ -420,19 +420,19 @@
<value>232, 22</value>
</data>
<data name="tsbCheckUpdateN.Text" xml:space="preserve">
<value>检查更新v2rayN</value>
<value>v2rayN</value>
</data>
<data name="tsbCheckUpdateCore.Size" type="System.Drawing.Size, System.Drawing">
<value>232, 22</value>
</data>
<data name="tsbCheckUpdateCore.Text" xml:space="preserve">
<value>检查更新v2rayCore</value>
<value>v2rayCore</value>
</data>
<data name="tsbCheckUpdatePACList.Size" type="System.Drawing.Size, System.Drawing">
<value>232, 22</value>
</data>
<data name="tsbCheckUpdatePACList.Text" xml:space="preserve">
<value>检查更新PAC</value>
<value>PAC</value>
</data>
<data name="tsbCheckClearPACList.Size" type="System.Drawing.Size, System.Drawing">
<value>232, 22</value>
@ -446,8 +446,11 @@
<data name="tsbCheckUpdate.Text" xml:space="preserve">
<value> 检查更新 </value>
</data>
<data name="tsbV2rayWebsite.Text" xml:space="preserve">
<value>V2Ray 官网</value>
</data>
<data name="tsbAbout.Text" xml:space="preserve">
<value>关于</value>
<value>v2rayN 项目</value>
</data>
<data name="tsbHelp.Size" type="System.Drawing.Size, System.Drawing">
<value>69, 53</value>
@ -469,6 +472,6 @@
</value>
</data>
<data name="tsbClose.Text" xml:space="preserve">
<value> 关闭 </value>
<value> 关闭窗口 </value>
</data>
</root>

View File

@ -132,7 +132,7 @@
<value>0</value>
</data>
<data name="chkShow.Text" xml:space="preserve">
<value>Show shared content</value>
<value>Sharing panel</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

View File

@ -54,10 +54,7 @@ namespace v2rayN.Forms
subItem.url = string.Empty;
}
if (OnButtonClicked != null)
{
OnButtonClicked(sender, e);
}
OnButtonClicked?.Invoke(sender, e);
}
}
}

View File

@ -47,9 +47,8 @@ namespace v2rayN.Forms
}
}
for (int k = 0; k < config.subItem.Count; k++)
foreach (var item in config.subItem)
{
var item = config.subItem[k];
SubSettingControl control = new SubSettingControl();
control.OnButtonClicked += Control_OnButtonClicked;
control.subItem = item;

View File

@ -6,6 +6,7 @@ namespace v2rayN
#region 常量
public const string v2rayWebsiteUrl = @"https://www.v2ray.com/";
public const string AboutUrl = @"https://github.com/2dust/v2rayN";
public const string UpdateUrl = AboutUrl + @"/releases";

View File

@ -247,7 +247,7 @@ namespace v2rayN.Handler
}
/// <summary>
/// 复制服务器
/// 克隆服务器
/// </summary>
/// <param name="config"></param>
/// <param name="index"></param>
@ -274,7 +274,7 @@ namespace v2rayN.Handler
vmessItem.streamSecurity = config.vmess[index].streamSecurity;
vmessItem.remarks = string.Format("{0}-clone", config.vmess[index].remarks);
config.vmess.Add(vmessItem);
config.vmess.Insert(index + 1, vmessItem); // 插入到下一项
ToJsonFile(config);
@ -724,7 +724,7 @@ namespace v2rayN.Handler
/// <param name="config"></param>
/// <param name="clipboardData"></param>
/// <param name="subid"></param>
/// <returns></returns>
/// <returns>成功导入的数量</returns>
public static int AddBatchServers(ref Config config, string clipboardData, string subid = "")
{
if (Utils.IsNullOrEmpty(clipboardData))
@ -779,11 +779,7 @@ namespace v2rayN.Handler
}
}
}
if (countServers > 0)
{
return 0;
}
return -1;
return countServers;
}
/// <summary>

View File

@ -4,7 +4,10 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using v2rayN.Base;
using v2rayN.Mode;
using v2rayN.Properties;
@ -47,98 +50,119 @@ namespace v2rayN.Handler
private DateTime totalDatetime = new DateTime();
private int DownloadTimeout = -1;
#region Check for updates
#region v2rayN
private string nLatestUrl = "https://github.com/2dust/v2rayN/releases/latest";
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/v2ray/v2ray-core/releases/latest";
private const string coreUrl = "https://github.com/v2ray/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip";
public void AbsoluteV2rayN(Config config)
public async Task CheckUpdateAsync(string type)
{
Utils.SetSecurityProtocol();
WebRequest request = WebRequest.Create(nLatestUrl);
request.BeginGetResponse(new AsyncCallback(OnResponseV2rayN), request);
WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
HttpClient httpClient = new HttpClient(webRequestHandler);
string url;
if (type == "Core")
{
url = coreLatestUrl;
}
else if (type == "v2rayN")
{
url = nLatestUrl;
}
else
{
throw new ArgumentException("Type");
}
HttpResponseMessage response = await httpClient.GetAsync(url);
if (response.StatusCode.ToString() == "Redirect")
{
responseHandler(type, response.Headers.Location.ToString());
}
else
{
Utils.SaveLog("StatusCode error: " + url);
return;
}
}
private void OnResponseV2rayN(IAsyncResult ar)
/// <summary>
/// 获取V2RayCore版本
/// </summary>
public string getV2rayVersion()
{
try
{
HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar);
string redirectUrl = response.ResponseUri.AbsoluteUri;
string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1);
var curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString();
if (curVersion == version)
string filePath = Utils.GetPath("V2ray.exe");
if (!File.Exists(filePath))
{
if (AbsoluteCompleted != null)
{
AbsoluteCompleted(this, new ResultEventArgs(false, "Already the latest version"));
}
return;
string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2ray/v2ray-core/releases");
//ShowMsg(true, msg);
return "";
}
string url = string.Format(nUrl, version);
if (AbsoluteCompleted != null)
{
AbsoluteCompleted(this, new ResultEventArgs(true, url));
}
Process p = new Process();
p.StartInfo.FileName = filePath;
p.StartInfo.Arguments = "-version";
p.StartInfo.WorkingDirectory = Utils.StartupPath();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.StandardOutputEncoding = Encoding.UTF8;
p.Start();
p.WaitForExit(5000);
string echo = p.StandardOutput.ReadToEnd();
string version = Regex.Match(echo, "V2Ray ([0-9.]+) \\(").Groups[1].Value;
return version;
}
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
if (Error != null)
Error(this, new ErrorEventArgs(ex));
return "";
}
}
#endregion
#region Core
private string coreLatestUrl = "https://github.com/v2ray/v2ray-core/releases/latest";
private const string coreUrl = "https://github.com/v2ray/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip";
public void AbsoluteV2rayCore(Config config)
{
Utils.SetSecurityProtocol();
WebRequest request = WebRequest.Create(coreLatestUrl);
request.BeginGetResponse(new AsyncCallback(OnResponseV2rayCore), request);
}
private void OnResponseV2rayCore(IAsyncResult ar)
private void responseHandler(string type, string redirectUrl)
{
try
{
HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar);
string redirectUrl = response.ResponseUri.AbsoluteUri;
string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1);
string osBit = string.Empty;
if (Environment.Is64BitProcess)
{
osBit = "64";
string curVersion;
string message;
string url;
if (type == "Core") {
curVersion = "v" + getV2rayVersion();
message = string.Format(UIRes.I18N("IsLatestCore"), curVersion);
string osBit = Environment.Is64BitProcess ? "64" : "32";
url = string.Format(coreUrl, version, osBit);
}
else if (type == "v2rayN") {
curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString();
message = string.Format(UIRes.I18N("IsLatestN"), curVersion);
url = string.Format(nUrl, version);
}
else
{
osBit = "32";
throw new ArgumentException("Type");
}
string url = string.Format(coreUrl, version, osBit);
if (AbsoluteCompleted != null)
if (curVersion == version)
{
AbsoluteCompleted(this, new ResultEventArgs(true, url));
AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message));
return;
}
AbsoluteCompleted?.Invoke(this, new ResultEventArgs(true, url));
}
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
if (Error != null)
Error(this, new ErrorEventArgs(ex));
Error?.Invoke(this, new ErrorEventArgs(ex));
}
}
@ -151,10 +175,7 @@ namespace v2rayN.Handler
try
{
Utils.SetSecurityProtocol();
if (UpdateCompleted != null)
{
UpdateCompleted(this, new ResultEventArgs(false, "Downloading..."));
}
UpdateCompleted?.Invoke(this, new ResultEventArgs(false, "Downloading..."));
progressPercentage = -1;
totalBytesToReceive = 0;
@ -174,8 +195,7 @@ namespace v2rayN.Handler
{
Utils.SaveLog(ex.Message, ex);
if (Error != null)
Error(this, new ErrorEventArgs(ex));
Error?.Invoke(this, new ErrorEventArgs(ex));
}
}
@ -240,8 +260,7 @@ namespace v2rayN.Handler
{
Utils.SaveLog(ex.Message, ex);
if (Error != null)
Error(this, new ErrorEventArgs(ex));
Error?.Invoke(this, new ErrorEventArgs(ex));
}
}
@ -274,10 +293,7 @@ namespace v2rayN.Handler
|| Utils.IsNullOrEmpty(e.Error.ToString()))
{
string source = e.Result;
if (UpdateCompleted != null)
{
UpdateCompleted(this, new ResultEventArgs(true, source));
}
UpdateCompleted?.Invoke(this, new ResultEventArgs(true, source));
}
else
{
@ -288,8 +304,7 @@ namespace v2rayN.Handler
{
Utils.SaveLog(ex.Message, ex);
if (Error != null)
Error(this, new ErrorEventArgs(ex));
Error?.Invoke(this, new ErrorEventArgs(ex));
}
}

View File

@ -72,9 +72,8 @@ namespace v2rayN.Handler
{
try
{
for (int k = 0; k < _selecteds.Count; k++)
foreach (int index in _selecteds)
{
int index = _selecteds[k];
if (_config.vmess[index].configType == (int)EConfigType.Custom)
{
continue;
@ -103,9 +102,8 @@ namespace v2rayN.Handler
{
try
{
for (int k = 0; k < _selecteds.Count; k++)
foreach (int index in _selecteds)
{
int index = _selecteds[k];
if (_config.vmess[index].configType == (int)EConfigType.Custom)
{
continue;
@ -121,7 +119,7 @@ namespace v2rayN.Handler
}
}
Thread.Sleep(100);
Thread.Sleep(10);
}
catch (Exception ex)
@ -142,9 +140,8 @@ namespace v2rayN.Handler
Thread.Sleep(5000);
var httpPort = _config.GetLocalPort("speedtest");
for (int k = 0; k < _selecteds.Count; k++)
foreach (int index in _selecteds)
{
int index = _selecteds[k];
if (_config.vmess[index].configType == (int)EConfigType.Custom)
{
continue;
@ -256,14 +253,24 @@ namespace v2rayN.Handler
try
{
IPHostEntry ipHostInfo = System.Net.Dns.GetHostEntry(url);
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPAddress ipAddress;
if (!System.Net.IPAddress.TryParse(url, out ipAddress))
{
IPHostEntry ipHostInfo = System.Net.Dns.GetHostEntry(url);
ipAddress = ipHostInfo.AddressList[0];
}
var timer = new Stopwatch();
timer.Start();
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(new IPEndPoint(ipAddress, port));
var endPoint = new IPEndPoint(ipAddress, port);
Socket clientSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
IAsyncResult result = clientSocket.BeginConnect(endPoint, null, null);
if (!result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5)))
throw new TimeoutException("connect timeout (5s): " + url);
clientSocket.EndConnect(result);
timer.Stop();
responseTime = timer.Elapsed.Milliseconds;
clientSocket.Close();

View File

@ -237,9 +237,9 @@ namespace v2rayN.Handler
rulesIP.outboundTag = tag;
rulesIP.ip = new List<string>();
for (int k = 0; k < userRule.Count; k++)
foreach (string u in userRule)
{
string url = userRule[k].TrimEx();
string url = u.TrimEx();
if (Utils.IsNullOrEmpty(url))
{
continue;
@ -1424,9 +1424,8 @@ namespace v2rayN.Handler
var httpPort = configCopy.GetLocalPort("speedtest");
for (int k = 0; k < selecteds.Count; k++)
foreach (int index in selecteds)
{
int index = selecteds[k];
if (configCopy.vmess[index].configType == (int)EConfigType.Custom)
{
continue;

View File

@ -152,9 +152,9 @@ namespace v2rayN.Handler
{
//查找v2ray文件是否存在
string fileName = string.Empty;
for (int k = 0; k < lstV2ray.Count; k++)
foreach (string name in lstV2ray)
{
string vName = string.Format("{0}.exe", lstV2ray[k]);
string vName = string.Format("{0}.exe", name);
vName = Utils.GetPath(vName);
if (File.Exists(vName))
{
@ -202,14 +202,11 @@ namespace v2rayN.Handler
/// <summary>
/// 消息委托
/// </summary>
/// <param name="notify"></param>
/// <param name="msg"></param>
private void ShowMsg(bool notify, string msg)
/// <param name="updateToTrayTooltip">是否更新托盘图标的工具提示</param>
/// <param name="msg">输出到日志框</param>
private void ShowMsg(bool updateToTrayTooltip, string msg)
{
if (ProcessEvent != null)
{
ProcessEvent(notify, msg);
}
ProcessEvent?.Invoke(updateToTrayTooltip, msg);
}
private void KillProcess(Process p)

View File

@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;
using v2rayN.Forms;
using v2rayN.Properties;
@ -31,6 +32,7 @@ namespace v2rayN
//AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Thread.Sleep(300); // 尽量避免切换语言后提示“已经运行”
Process instance = RunningInstance();
if (instance == null)
{

View File

@ -19,7 +19,7 @@ namespace v2rayN.Resx {
// 类通过类似于 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 ResUI {
@ -267,6 +267,24 @@ namespace v2rayN.Resx {
}
}
/// <summary>
/// 查找类似 {0} already up to date. 的本地化字符串。
/// </summary>
internal static string IsLatestCore {
get {
return ResourceManager.GetString("IsLatestCore", resourceCulture);
}
}
/// <summary>
/// 查找类似 {0} already up to date. 的本地化字符串。
/// </summary>
internal static string IsLatestN {
get {
return ResourceManager.GetString("IsLatestN", resourceCulture);
}
}
/// <summary>
/// 查找类似 Address 的本地化字符串。
/// </summary>
@ -574,7 +592,7 @@ namespace v2rayN.Resx {
}
/// <summary>
/// 查找类似 V2ray-core not found, download address: {0} 的本地化字符串。
/// 查找类似 V2ray-core not found, please download: {0} 的本地化字符串。
/// </summary>
internal static string NotFoundCore {
get {
@ -645,6 +663,15 @@ namespace v2rayN.Resx {
}
}
/// <summary>
/// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。
/// </summary>
internal static string RemoveDuplicateServerResult {
get {
return ResourceManager.GetString("RemoveDuplicateServerResult", resourceCulture);
}
}
/// <summary>
/// 查找类似 Are you sure to remove the server? 的本地化字符串。
/// </summary>
@ -691,7 +718,7 @@ namespace v2rayN.Resx {
}
/// <summary>
/// 查找类似 PAC failed to start. Pls with an administrator. 的本地化字符串。
/// 查找类似 PAC failed to start. Run it with Admin right. 的本地化字符串。
/// </summary>
internal static string StartPacFailed {
get {
@ -700,7 +727,7 @@ namespace v2rayN.Resx {
}
/// <summary>
/// 查找类似 Start service ({0})...... 的本地化字符串。
/// 查找类似 Start service ({0})... 的本地化字符串。
/// </summary>
internal static string StartService {
get {
@ -728,7 +755,7 @@ namespace v2rayN.Resx {
}
/// <summary>
/// 查找类似 Imported bulk URL from clipboard successfully 的本地化字符串。
/// 查找类似 {0} servers have been imported from clipboard. 的本地化字符串。
/// </summary>
internal static string SuccessfullyImportedServerViaClipboard {
get {

View File

@ -175,7 +175,7 @@
<value>Successfully imported custom configuration server</value>
</data>
<data name="SuccessfullyImportedServerViaClipboard" xml:space="preserve">
<value>Imported bulk URL from clipboard successfully</value>
<value>{0} servers have been imported from clipboard.</value>
</data>
<data name="CustomServerTips" xml:space="preserve">
<value>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.</value>
@ -236,10 +236,16 @@
{0}</value>
</data>
<data name="NotFoundCore" xml:space="preserve">
<value>V2ray-core not found, download address: {0}</value>
<value>V2ray-core not found, please download: {0}</value>
</data>
<data name="IsLatestN" xml:space="preserve">
<value>{0} already up to date.</value>
</data>
<data name="IsLatestCore" xml:space="preserve">
<value>{0} already up to date.</value>
</data>
<data name="StartService" xml:space="preserve">
<value>Start service ({0})......</value>
<value>Start service ({0})...</value>
</data>
<data name="LvAddress" xml:space="preserve">
<value>Address</value>
@ -344,6 +350,9 @@
<value>Total upload traffic</value>
</data>
<data name="StartPacFailed" xml:space="preserve">
<value>PAC failed to start. Pls with an administrator.</value>
<value>PAC failed to start. Run it with Admin right.</value>
</data>
<data name="RemoveDuplicateServerResult" xml:space="preserve">
<value>Servers deduplication completed. Old: {0}, New: {1}.</value>
</data>
</root>

View File

@ -175,7 +175,7 @@
<value>成功导入自定义配置服务器</value>
</data>
<data name="SuccessfullyImportedServerViaClipboard" xml:space="preserve">
<value>从剪贴板导入批量URL成功</value>
<value>成功从剪贴板导入 {0} 个服务器</value>
</data>
<data name="CustomServerTips" xml:space="preserve">
<value>注意,自定义配置完全依赖您自己的配置不能使用所有设置功能。在自定义配置inbound中有socks port等于设置中的port时系统代理才可用</value>
@ -236,10 +236,16 @@
{0}</value>
</data>
<data name="NotFoundCore" xml:space="preserve">
<value>未找到v2ray-core,下载地址:{0}</value>
<value>找不到 v2ray-core下载地址: {0}</value>
</data>
<data name="IsLatestN" xml:space="preserve">
<value>{0} 已是最新版本。</value>
</data>
<data name="IsLatestCore" xml:space="preserve">
<value>{0} 已是最新版本。</value>
</data>
<data name="StartService" xml:space="preserve">
<value>启动服务({0})......</value>
<value>启动服务({0})...</value>
</data>
<data name="LvAddress" xml:space="preserve">
<value>地址</value>
@ -254,7 +260,7 @@
<value>端口</value>
</data>
<data name="LvServiceType" xml:space="preserve">
<value>服务类型</value>
<value>类型</value>
</data>
<data name="LvSubscription" xml:space="preserve">
<value>订阅</value>
@ -346,4 +352,7 @@
<data name="StartPacFailed" xml:space="preserve">
<value>PAC服务启动失败,请用管理员启动</value>
</data>
<data name="RemoveDuplicateServerResult" xml:space="preserve">
<value>服务器去重完成。原数量: {0},现数量: {1}</value>
</data>
</root>

View File

@ -7,7 +7,7 @@ namespace v2rayN
{
public static void Show(string msg)
{
MessageBox.Show(msg);
MessageBox.Show(msg, "v2rayN", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
public static DialogResult ShowYesNo(string msg)

View File

@ -317,7 +317,7 @@ namespace v2rayN
double result;
string unit;
ToHumanReadable(amount, out result, out unit);
return $"{string.Format("{0:f1}", result)}{unit}";
return $"{string.Format("{0:f1}", result)} {unit}";
}
public static void DedupServerList(List<Mode.VmessItem> source, out List<Mode.VmessItem> result)

View File

@ -116,6 +116,8 @@
</Reference>
<Reference Include="System.Messaging" />
<Reference Include="System.Net" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>LIB\System.Runtime.CompilerServices.Unsafe.dll</HintPath>