Merge pull request #695 from yfdyh000/pr8

界面和功能增强
This commit is contained in:
2dust 2020-04-19 16:57:49 +08:00 committed by GitHub
commit 78402118ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
35 changed files with 3275 additions and 2218 deletions

View file

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio Version 16
VisualStudioVersion = 15.0.28010.2050 VisualStudioVersion = 16.0.29926.136
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayN", "v2rayN\v2rayN.csproj", "{0A9785E6-D256-4B73-9757-4EF59955FD1E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayN", "v2rayN\v2rayN.csproj", "{0A9785E6-D256-4B73-9757-4EF59955FD1E}"
EndProject EndProject
@ -35,7 +35,8 @@ Global
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
RESX_SortFileContentOnSave = True RESX_ResXSortingComparison = CurrentCulture
SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E} SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E}
RESX_SortFileContentOnSave = True
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View file

@ -41,7 +41,7 @@ namespace v2rayN.Base
listener.Start(); listener.Start();
Utils.SaveLog("WebserverB running..."); Utils.SaveLog("WebserverB running...");
while (true) while (true && listener != null)
{ {
if (!listener.Pending()) if (!listener.Pending())
{ {

View file

@ -0,0 +1,42 @@
using System.Windows.Forms;
namespace v2rayN.Base
{
// ref: https://stackoverflow.com/questions/1214289/how-do-i-sort-integers-in-a-listview
class Sorter : System.Collections.IComparer
{
public int Column = 0;
public int Sorting = 0;
public int Compare(object x, object y) // IComparer Member
{
if (!(x is ListViewItem) || !(y is ListViewItem))
return (0);
ListViewItem l1 = (ListViewItem)x;
ListViewItem l2 = (ListViewItem)y;
int doIntSort = Sorting;
if (doIntSort > 0 // Tag will be number
&& (ulong.TryParse(l1.SubItems[Column].Tag?.ToString(), out ulong fl1)
&& ulong.TryParse(l2.SubItems[Column].Tag?.ToString(), out ulong fl2)) // fallback to text
)
{
if (doIntSort == 1)
return fl1.CompareTo(fl2);
else
return fl2.CompareTo(fl1);
}
else
{
string str1 = l1.SubItems[Column].Text;
string str2 = l2.SubItems[Column].Text;
if (doIntSort == -1 || doIntSort == 1)
return str1.CompareTo(str2);
else
return str2.CompareTo(str1);
}
}
}
}

View file

@ -5,10 +5,7 @@ namespace v2rayN.Base
{ {
class WebClientEx : WebClient class WebClientEx : WebClient
{ {
public int Timeout public int Timeout { get; set; }
{
get; set;
}
public WebClientEx(int timeout = 3000) public WebClientEx(int timeout = 3000)
{ {
Timeout = timeout; Timeout = timeout;

View file

@ -55,7 +55,7 @@
this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem();
this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem();
this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem();
this.tsbTestMe = new System.Windows.Forms.ToolStripMenuItem(); this.menuTestMe = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem();
this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem();
@ -94,6 +94,8 @@
this.toolSslPacPortLab = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslPacPortLab = new System.Windows.Forms.ToolStripStatusLabel();
this.toolSslPacPort = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslPacPort = new System.Windows.Forms.ToolStripStatusLabel();
this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel();
this.toolSslRouting = new System.Windows.Forms.ToolStripStatusLabel();
this.toolSslServerLatency = new System.Windows.Forms.ToolStripStatusLabel();
this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel();
this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel();
this.panel1 = new System.Windows.Forms.Panel(); this.panel1 = new System.Windows.Forms.Panel();
@ -153,20 +155,21 @@
// //
// lvServers // lvServers
// //
this.lvServers.AllowColumnReorder = true;
this.lvServers.ContextMenuStrip = this.cmsLv; this.lvServers.ContextMenuStrip = this.cmsLv;
resources.ApplyResources(this.lvServers, "lvServers"); resources.ApplyResources(this.lvServers, "lvServers");
this.lvServers.FullRowSelect = true; this.lvServers.FullRowSelect = true;
this.lvServers.GridLines = true; this.lvServers.GridLines = true;
this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.lvServers.HideSelection = false; this.lvServers.HideSelection = false;
this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] { this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))}); ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))});
this.lvServers.MultiSelect = false;
this.lvServers.Name = "lvServers"; this.lvServers.Name = "lvServers";
this.lvServers.UseCompatibleStateImageBehavior = false; this.lvServers.UseCompatibleStateImageBehavior = false;
this.lvServers.View = System.Windows.Forms.View.Details; this.lvServers.View = System.Windows.Forms.View.Details;
this.lvServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvServers_ColumnClick);
this.lvServers.ColumnReordered += new System.Windows.Forms.ColumnReorderedEventHandler(this.lvServers_ColumnReordered);
this.lvServers.ColumnWidthChanged += new System.Windows.Forms.ColumnWidthChangedEventHandler(this.lvServers_ColumnWidthChanged);
this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged); 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.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick);
this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown); this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown);
// //
@ -196,7 +199,7 @@
this.menuTcpingServer, this.menuTcpingServer,
this.menuRealPingServer, this.menuRealPingServer,
this.menuSpeedServer, this.menuSpeedServer,
this.tsbTestMe, this.menuTestMe,
this.toolStripSeparator6, this.toolStripSeparator6,
this.menuExport2ClientConfig, this.menuExport2ClientConfig,
this.menuExport2ServerConfig, this.menuExport2ServerConfig,
@ -335,11 +338,11 @@
resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer");
this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click);
// //
// tsbTestMe // menuTestMe
// //
this.tsbTestMe.Name = "tsbTestMe"; this.menuTestMe.Name = "menuTestMe";
resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); resources.ApplyResources(this.menuTestMe, "menuTestMe");
this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); this.menuTestMe.Click += new System.EventHandler(this.menuTestMe_Click);
// //
// toolStripSeparator6 // toolStripSeparator6
// //
@ -533,6 +536,7 @@
// //
// ssMain // ssMain
// //
this.ssMain.AllowItemReorder = true;
this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolSslSocksPortLab, this.toolSslSocksPortLab,
this.toolSslSocksPort, this.toolSslSocksPort,
@ -543,65 +547,124 @@
this.toolSslPacPortLab, this.toolSslPacPortLab,
this.toolSslPacPort, this.toolSslPacPort,
this.toolSslBlank3, this.toolSslBlank3,
this.toolSslRouting,
this.toolSslServerLatency,
this.toolSslServerSpeed, this.toolSslServerSpeed,
this.toolSslBlank4}); this.toolSslBlank4});
resources.ApplyResources(this.ssMain, "ssMain"); resources.ApplyResources(this.ssMain, "ssMain");
this.ssMain.Name = "ssMain"; this.ssMain.Name = "ssMain";
this.ssMain.ShowItemToolTips = true;
this.ssMain.TabStop = true;
this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked);
// //
// toolSslSocksPortLab // toolSslSocksPortLab
// //
resources.ApplyResources(this.toolSslSocksPortLab, "toolSslSocksPortLab"); this.toolSslSocksPortLab.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslSocksPortLab.Name = "toolSslSocksPortLab"; this.toolSslSocksPortLab.Name = "toolSslSocksPortLab";
this.toolSslSocksPortLab.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslSocksPortLab, "toolSslSocksPortLab");
// //
// toolSslSocksPort // toolSslSocksPort
// //
this.toolSslSocksPort.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslSocksPort.Name = "toolSslSocksPort"; this.toolSslSocksPort.Name = "toolSslSocksPort";
this.toolSslSocksPort.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort");
// //
// toolSslBlank1 // toolSslBlank1
// //
resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1"); this.toolSslBlank1.AutoToolTip = true;
this.toolSslBlank1.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right;
this.toolSslBlank1.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
this.toolSslBlank1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslBlank1.Name = "toolSslBlank1"; this.toolSslBlank1.Name = "toolSslBlank1";
this.toolSslBlank1.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1");
this.toolSslBlank1.Spring = true; this.toolSslBlank1.Spring = true;
// //
// toolSslHttpPortLab // toolSslHttpPortLab
// //
resources.ApplyResources(this.toolSslHttpPortLab, "toolSslHttpPortLab"); this.toolSslHttpPortLab.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslHttpPortLab.Name = "toolSslHttpPortLab"; this.toolSslHttpPortLab.Name = "toolSslHttpPortLab";
this.toolSslHttpPortLab.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslHttpPortLab, "toolSslHttpPortLab");
// //
// toolSslHttpPort // toolSslHttpPort
// //
this.toolSslHttpPort.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslHttpPort.Name = "toolSslHttpPort"; this.toolSslHttpPort.Name = "toolSslHttpPort";
this.toolSslHttpPort.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort");
// //
// toolSslBlank2 // toolSslBlank2
// //
resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); this.toolSslBlank2.AutoToolTip = true;
this.toolSslBlank2.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right;
this.toolSslBlank2.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
this.toolSslBlank2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslBlank2.Name = "toolSslBlank2"; this.toolSslBlank2.Name = "toolSslBlank2";
this.toolSslBlank2.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2");
this.toolSslBlank2.Spring = true; this.toolSslBlank2.Spring = true;
// //
// toolSslPacPortLab // toolSslPacPortLab
// //
resources.ApplyResources(this.toolSslPacPortLab, "toolSslPacPortLab"); this.toolSslPacPortLab.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslPacPortLab.Name = "toolSslPacPortLab"; this.toolSslPacPortLab.Name = "toolSslPacPortLab";
this.toolSslPacPortLab.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslPacPortLab, "toolSslPacPortLab");
// //
// toolSslPacPort // toolSslPacPort
// //
this.toolSslPacPort.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslPacPort.Name = "toolSslPacPort"; this.toolSslPacPort.Name = "toolSslPacPort";
this.toolSslPacPort.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort"); resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort");
// //
// toolSslBlank3 // toolSslBlank3
// //
resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3"); this.toolSslBlank3.AutoToolTip = true;
this.toolSslBlank3.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right;
this.toolSslBlank3.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
this.toolSslBlank3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslBlank3.Name = "toolSslBlank3"; this.toolSslBlank3.Name = "toolSslBlank3";
this.toolSslBlank3.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3");
this.toolSslBlank3.Spring = true; this.toolSslBlank3.Spring = true;
// //
// toolSslRouting
//
this.toolSslRouting.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right;
this.toolSslRouting.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
this.toolSslRouting.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslRouting.IsLink = true;
this.toolSslRouting.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline;
this.toolSslRouting.LinkColor = System.Drawing.SystemColors.ControlText;
this.toolSslRouting.Margin = new System.Windows.Forms.Padding(0, 3, 5, 2);
this.toolSslRouting.Name = "toolSslRouting";
this.toolSslRouting.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never;
resources.ApplyResources(this.toolSslRouting, "toolSslRouting");
this.toolSslRouting.Click += new System.EventHandler(this.toolSslRouting_Click);
//
// toolSslServerLatency
//
resources.ApplyResources(this.toolSslServerLatency, "toolSslServerLatency");
this.toolSslServerLatency.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right;
this.toolSslServerLatency.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
this.toolSslServerLatency.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslServerLatency.IsLink = true;
this.toolSslServerLatency.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline;
this.toolSslServerLatency.LinkColor = System.Drawing.SystemColors.ControlText;
this.toolSslServerLatency.Margin = new System.Windows.Forms.Padding(0, 3, 5, 2);
this.toolSslServerLatency.Name = "toolSslServerLatency";
this.toolSslServerLatency.Click += new System.EventHandler(this.toolSslServerLatency_Click);
//
// toolSslServerSpeed // toolSslServerSpeed
// //
resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed");
this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolSslServerSpeed.Name = "toolSslServerSpeed"; this.toolSslServerSpeed.Name = "toolSslServerSpeed";
resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed");
this.toolSslServerSpeed.Click += new System.EventHandler(this.toolSslServerSpeed_Click);
// //
// toolSslBlank4 // toolSslBlank4
// //
@ -819,6 +882,7 @@
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
this.Load += new System.EventHandler(this.MainForm_Load); this.Load += new System.EventHandler(this.MainForm_Load);
this.Shown += new System.EventHandler(this.MainForm_Shown); this.Shown += new System.EventHandler(this.MainForm_Shown);
this.ResizeEnd += new System.EventHandler(this.MainForm_ResizeEnd);
this.VisibleChanged += new System.EventHandler(this.MainForm_VisibleChanged); this.VisibleChanged += new System.EventHandler(this.MainForm_VisibleChanged);
this.Resize += new System.EventHandler(this.MainForm_Resize); this.Resize += new System.EventHandler(this.MainForm_Resize);
this.scMain.Panel1.ResumeLayout(false); this.scMain.Panel1.ResumeLayout(false);
@ -932,9 +996,11 @@
private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite; private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite;
private System.Windows.Forms.ToolStripMenuItem menuKeepNothing; private System.Windows.Forms.ToolStripMenuItem menuKeepNothing;
private System.Windows.Forms.ToolStripMenuItem menuKeepPACNothing; private System.Windows.Forms.ToolStripMenuItem menuKeepPACNothing;
private System.Windows.Forms.ToolStripMenuItem tsbTestMe; private System.Windows.Forms.ToolStripMenuItem menuTestMe;
private System.Windows.Forms.ToolStripButton tsbReload; private System.Windows.Forms.ToolStripButton tsbReload;
private System.Windows.Forms.ToolStripButton tsbQRCodeSwitch; private System.Windows.Forms.ToolStripButton tsbQRCodeSwitch;
private System.Windows.Forms.ToolStripStatusLabel toolSslServerLatency;
private System.Windows.Forms.ToolStripStatusLabel toolSslRouting;
} }
} }

View file

@ -11,13 +11,15 @@ using v2rayN.Tool;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Net; using System.Net;
using System.Threading.Tasks;
using System.Linq;
namespace v2rayN.Forms namespace v2rayN.Forms
{ {
public partial class MainForm : BaseForm public partial class MainForm : BaseForm
{ {
private V2rayHandler v2rayHandler; private V2rayHandler v2rayHandler;
private List<int> lvSelecteds = new List<int>(); private List<int> lvSelecteds = new List<int>(); // 使用前需用 GetServerListSelectedConfigIndex 更新
private StatisticsHandler statistics = null; private StatisticsHandler statistics = null;
#region Window #region Window
@ -33,14 +35,7 @@ namespace v2rayN.Forms
Application.ApplicationExit += (sender, args) => Application.ApplicationExit += (sender, args) =>
{ {
v2rayHandler.V2rayStop(); Closes();
HttpProxyHandle.CloseHttpAgent(config);
PACServerHandle.Stop();
ConfigHandler.SaveConfig(ref config);
statistics?.SaveToFile();
statistics?.Close();
}; };
} }
@ -54,6 +49,8 @@ namespace v2rayN.Forms
{ {
statistics = new StatisticsHandler(config, UpdateStatisticsHandler); statistics = new StatisticsHandler(config, UpdateStatisticsHandler);
} }
Microsoft.Win32.SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged);
} }
private void MainForm_VisibleChanged(object sender, EventArgs e) private void MainForm_VisibleChanged(object sender, EventArgs e)
@ -85,7 +82,6 @@ namespace v2rayN.Forms
{ {
if (e.CloseReason == CloseReason.UserClosing) if (e.CloseReason == CloseReason.UserClosing)
{ {
StorageUI();
e.Cancel = true; e.Cancel = true;
HideForm(); HideForm();
return; return;
@ -123,7 +119,9 @@ namespace v2rayN.Forms
// break; // break;
// } // }
//} //}
#endregion
#region /
private void RestoreUI() private void RestoreUI()
{ {
scMain.Panel2Collapsed = true; scMain.Panel2Collapsed = true;
@ -134,20 +132,21 @@ namespace v2rayN.Forms
this.Height = config.uiItem.mainSize.Height; this.Height = config.uiItem.mainSize.Height;
} }
for (int k = 0; k < lvServers.Columns.Count; k++) foreach (ColumnHeader c in lvServers.Columns)
{ {
var width = ConfigHandler.GetformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width); var width = ConfigHandler.GetformMainLvColWidth(ref config, c.Name, c.Width);
lvServers.Columns[k].Width = width; c.Width = width;
} }
} }
// Deprecated.
private void StorageUI() private void StorageUI()
{ {
config.uiItem.mainSize = new Size(this.Width, this.Height); config.uiItem.mainSize = new Size(this.Width, this.Height);
for (int k = 0; k < lvServers.Columns.Count; k++) foreach (ColumnHeader c in lvServers.Columns)
{ {
ConfigHandler.AddformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width); ConfigHandler.AddformMainLvColWidth(ref config, c.Name, c.Width);
} }
} }
@ -170,32 +169,40 @@ namespace v2rayN.Forms
/// </summary> /// </summary>
private void InitServersView() private void InitServersView()
{ {
lvServers.ListViewItemSorter = new Sorter();
lvServers.BeginUpdate(); lvServers.BeginUpdate();
lvServers.Items.Clear(); lvServers.Items.Clear();
lvServers.GridLines = true; lvServers.Columns.Add(EServerColName.def.ToString(), "", 30);
lvServers.FullRowSelect = true; lvServers.Columns.Add(EServerColName.type.ToString(), UIRes.I18N("LvServiceType"), 80);
lvServers.View = View.Details; lvServers.Columns.Add(EServerColName.remarks.ToString(), UIRes.I18N("LvAlias"), 100);
lvServers.Scrollable = true; lvServers.Columns.Add(EServerColName.address.ToString(), UIRes.I18N("LvAddress"), 120);
lvServers.MultiSelect = true; lvServers.Columns.Add(EServerColName.port.ToString(), UIRes.I18N("LvPort"), 50);
lvServers.HeaderStyle = ColumnHeaderStyle.Nonclickable; lvServers.Columns.Add(EServerColName.security.ToString(), UIRes.I18N("LvEncryptionMethod"), 90);
lvServers.Columns.Add(EServerColName.network.ToString(), UIRes.I18N("LvTransportProtocol"), 70);
lvServers.Columns.Add("", 30); lvServers.Columns.Add(EServerColName.subRemarks.ToString(), UIRes.I18N("LvSubscription"), 50);
lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80); lvServers.Columns.Add(EServerColName.testResult.ToString(), UIRes.I18N("LvTestResults"), 70);
lvServers.Columns.Add(UIRes.I18N("LvAlias"), 100);
lvServers.Columns.Add(UIRes.I18N("LvAddress"), 120);
lvServers.Columns.Add(UIRes.I18N("LvPort"), 50);
lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 90);
lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 70);
lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50);
lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 70, HorizontalAlignment.Right);
lvServers.Columns[EServerColName.port.ToString()].Tag = Global.sortMode.Numeric.ToString();
if (statistics != null && statistics.Enable) if (statistics != null && statistics.Enable)
{ {
lvServers.Columns.Add(UIRes.I18N("LvTodayDownloadDataAmount"), 70); lvServers.Columns.Add(EServerColName.todayDown.ToString(), UIRes.I18N("LvTodayDownloadDataAmount"), 70);
lvServers.Columns.Add(UIRes.I18N("LvTodayUploadDataAmount"), 70); lvServers.Columns.Add(EServerColName.todayUp.ToString(), UIRes.I18N("LvTodayUploadDataAmount"), 70);
lvServers.Columns.Add(UIRes.I18N("LvTotalDownloadDataAmount"), 70); lvServers.Columns.Add(EServerColName.totalDown.ToString(), UIRes.I18N("LvTotalDownloadDataAmount"), 70);
lvServers.Columns.Add(UIRes.I18N("LvTotalUploadDataAmount"), 70); lvServers.Columns.Add(EServerColName.totalUp.ToString(), UIRes.I18N("LvTotalUploadDataAmount"), 70);
lvServers.Columns[EServerColName.todayDown.ToString()].Tag = Global.sortMode.Numeric.ToString();
lvServers.Columns[EServerColName.todayUp.ToString()].Tag = Global.sortMode.Numeric.ToString();
lvServers.Columns[EServerColName.totalDown.ToString()].Tag = Global.sortMode.Numeric.ToString();
lvServers.Columns[EServerColName.totalUp.ToString()].Tag = Global.sortMode.Numeric.ToString();
}
foreach (ColumnHeader c in lvServers.Columns)
{
if (config.uiItem.mainLvColLayout == null) break;
int i = config.uiItem.mainLvColLayout.IndexOf(c.Name);
if (i >= 0) c.DisplayIndex = i;
} }
lvServers.EndUpdate(); lvServers.EndUpdate();
} }
@ -205,9 +212,9 @@ namespace v2rayN.Forms
/// </summary> /// </summary>
private void RefreshServersView() private void RefreshServersView()
{ {
lvServers.BeginUpdate();
lvServers.Items.Clear(); lvServers.Items.Clear();
List<ListViewItem> lst = new List<ListViewItem>();
for (int k = 0; k < config.vmess.Count; k++) for (int k = 0; k < config.vmess.Count; k++)
{ {
string def = string.Empty; string def = string.Empty;
@ -222,10 +229,23 @@ namespace v2rayN.Forms
VmessItem item = config.vmess[k]; VmessItem item = config.vmess[k];
void _addSubItem(ListViewItem i, string name, string text) void _addSubItem(ListViewItem i, string name, string text, object tag = null)
{ {
i.SubItems.Add(new ListViewItem.ListViewSubItem() { Name = name, Text = text }); var n = new ListViewItem.ListViewSubItem() { Text = text };
n.Name = name; // new don't accept it.
n.Tag = tag; // cell's data store.
i.SubItems.Add(n);
} }
ListViewItem lvItem = new ListViewItem(def);
lvItem.Tag = k; // the Tag of line is config's index.
_addSubItem(lvItem, EServerColName.type.ToString(), ((EConfigType)item.configType).ToString());
_addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks);
_addSubItem(lvItem, EServerColName.address.ToString(), item.address);
_addSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString(), item.port);
_addSubItem(lvItem, EServerColName.security.ToString(), item.security);
_addSubItem(lvItem, EServerColName.network.ToString(), item.network);
_addSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config));
_addSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult);
bool stats = statistics != null && statistics.Enable; bool stats = statistics != null && statistics.Enable;
if (stats) if (stats)
{ {
@ -237,38 +257,26 @@ namespace v2rayN.Forms
todayUp = Utils.HumanFy(sItem.todayUp); todayUp = Utils.HumanFy(sItem.todayUp);
todayDown = Utils.HumanFy(sItem.todayDown); todayDown = Utils.HumanFy(sItem.todayDown);
} }
} _addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown, sItem?.todayDown);
ListViewItem lvItem = new ListViewItem(def); _addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp, sItem?.todayUp);
_addSubItem(lvItem, EServerColName.type.ToString(), ((EConfigType)item.configType).ToString()); _addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown, sItem?.totalDown);
_addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); _addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp, sItem?.totalUp);
_addSubItem(lvItem, EServerColName.address.ToString(), item.address);
_addSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString());
_addSubItem(lvItem, EServerColName.security.ToString(), item.security);
_addSubItem(lvItem, EServerColName.network.ToString(), item.network);
_addSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config));
_addSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult);
if (stats)
{
_addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown);
_addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp);
_addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown);
_addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp);
} }
if (k % 2 == 1) // 隔行着色 if (config.interlaceColoring && k % 2 == 1) // 隔行着色
{ {
lvItem.BackColor = Color.WhiteSmoke; lvItem.BackColor = SystemColors.Control;
} }
if (config.index.Equals(k)) if (config.index.Equals(k))
{ {
//lvItem.Checked = true; //lvItem.Checked = true;
lvItem.ForeColor = Color.DodgerBlue; lvItem.ForeColor = SystemColors.MenuHighlight;
lvItem.Font = new Font(lvItem.Font, FontStyle.Bold); lvItem.Font = new Font(lvItem.Font, FontStyle.Bold);
} }
if (lvItem != null) lvServers.Items.Add(lvItem); if (lvItem != null) lst.Add(lvItem);
} }
lvServers.EndUpdate(); lvServers.Items.AddRange(lst.ToArray());
//if (lvServers.Items.Count > 0) //if (lvServers.Items.Count > 0)
//{ //{
@ -323,26 +331,24 @@ namespace v2rayN.Forms
private void lvServers_SelectedIndexChanged(object sender, EventArgs e) private void lvServers_SelectedIndexChanged(object sender, EventArgs e)
{ {
int index = -1; RefreshQRCodePanel();
try
{
if (lvServers.SelectedIndices.Count > 0)
{
index = lvServers.SelectedIndices[0];
}
}
catch
{
}
if (index < 0)
{
return;
}
//qrCodeControl.showQRCode(index, config);
} }
private void RefreshQRCodePanel()
{
if (scMain.Panel2Collapsed) return; // saving cpu.
int index = GetConfigIndexFromServerListSelected();
if (index < 0) return;
qrCodeControl.showQRCode(index, config);
}
private void RefreshTaryIcon()
{
notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon);
}
private void DisplayToolStatus() private void DisplayToolStatus()
{ {
ssMain.SuspendLayout();
toolSslSocksPort.Text = toolSslSocksPort.Text =
toolSslHttpPort.Text = toolSslHttpPort.Text =
toolSslPacPort.Text = "OFF"; toolSslPacPort.Text = "OFF";
@ -367,7 +373,26 @@ namespace v2rayN.Forms
} }
} }
notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); string routingStatus = "";
switch (config.routingMode)
{
case 0:
routingStatus = UIRes.I18N("RoutingModeGlobal");
break;
case 1:
routingStatus = UIRes.I18N("RoutingModeBypassLAN");
break;
case 2:
routingStatus = UIRes.I18N("RoutingModeBypassCN");
break;
case 3:
routingStatus = UIRes.I18N("RoutingModeBypassLANCN");
break;
}
toolSslRouting.Text = routingStatus;
ssMain.ResumeLayout();
RefreshTaryIcon();
} }
private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{ {
@ -379,73 +404,83 @@ namespace v2rayN.Forms
#endregion #endregion
#region v2ray public static Task autoLatencyRefreshTask;
private void autoLatencyRefresh()
{
if (config.listenerType != ListenerType.noHttpProxy)
{
if (autoLatencyRefreshTask == null || autoLatencyRefreshTask.IsCompleted)
{
autoLatencyRefreshTask = Task.Run(async delegate
{
if (!this.IsHandleCreated) return; // the GUI app is exiting.
await Task.Delay(2000);
this.Invoke((MethodInvoker)(delegate
{
toolSslServerLatencyRefresh();
}));
});
}
}
}
#region v2ray
/// <summary> /// <summary>
/// 载入V2ray /// 载入V2ray
/// </summary> /// </summary>
private void LoadV2ray() private async void LoadV2ray()
{ {
tsbReload.Enabled = false; this.Invoke((MethodInvoker)(delegate
if (Global.reloadV2ray)
{ {
ClearMsg(); tsbReload.Enabled = false;
}
v2rayHandler.LoadV2ray(config); if (Global.reloadV2ray)
{
ClearMsg();
}
}));
await v2rayHandler.LoadV2ray(config);
Global.reloadV2ray = false; Global.reloadV2ray = false;
ConfigHandler.SaveConfig(ref config, false); ChangePACButtonStatus(config.listenerType);
//ConfigHandler.SaveConfigToFile(ref config, false); // ChangePACButtonStatus does it.
statistics?.SaveToFile(); statistics?.SaveToFile();
ChangePACButtonStatus(config.listenerType); this.Invoke((MethodInvoker)(delegate
{
tsbReload.Enabled = true;
tsbReload.Enabled = true; autoLatencyRefresh();
}));
} }
/// <summary> /// <summary>
/// 关闭V2ray /// 关闭相关组件
/// </summary> /// </summary>
private void CloseV2ray() private void Closes()
{ {
ConfigHandler.SaveConfig(ref config, false); List<Task> tasks = new List<Task>
statistics?.SaveToFile(); {
Task.Run(() => ConfigHandler.SaveConfigToFile(ref config)),
ChangePACButtonStatus(0); Task.Run(() => HttpProxyHandle.CloseHttpAgent(config)),
Task.Run(() => v2rayHandler.V2rayStop()),
v2rayHandler.V2rayStop(); Task.Run(() => PACServerHandle.Stop()),
Task.Run(() =>
{
statistics?.SaveToFile();
statistics?.Close();
})
};
Task.WaitAll(tasks.ToArray());
} }
#endregion #endregion
#region #region
private void lvServers_Click(object sender, EventArgs e)
{
int index = -1;
try
{
if (lvServers.SelectedIndices.Count > 0)
{
index = lvServers.SelectedIndices[0];
}
}
catch
{
}
if (index < 0)
{
return;
}
qrCodeControl.showQRCode(index, config);
}
private void lvServers_DoubleClick(object sender, EventArgs e) private void lvServers_DoubleClick(object sender, EventArgs e)
{ {
int index = GetLvSelectedIndex(); int index = GetConfigIndexFromServerListSelected();
if (index < 0) if (index < 0) return;
{
return;
}
if (config.vmess[index].configType == (int)EConfigType.Vmess) if (config.vmess[index].configType == (int)EConfigType.Vmess)
{ {
@ -573,12 +608,9 @@ namespace v2rayN.Forms
private void menuRemoveServer_Click(object sender, EventArgs e) private void menuRemoveServer_Click(object sender, EventArgs e)
{ {
int index = GetConfigIndexFromServerListSelected();
if (index < 0) return;
int index = GetLvSelectedIndex();
if (index < 0)
{
return;
}
if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No) if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No)
{ {
return; return;
@ -595,12 +627,22 @@ namespace v2rayN.Forms
private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) private void menuRemoveDuplicateServer_Click(object sender, EventArgs e)
{ {
VmessItem activeVm = null;
if (config.index >= 0) {
activeVm = config.vmess[config.index];
}
Utils.DedupServerList(config.vmess, out List<VmessItem> servers, config.keepOlderDedupl); Utils.DedupServerList(config.vmess, out List<VmessItem> servers, config.keepOlderDedupl);
int oldCount = config.vmess.Count; int oldCount = config.vmess.Count;
int newCount = servers.Count; int newCount = servers.Count;
if (servers != null) if (servers != null)
{ {
config.vmess = servers; config.vmess = servers;
if (activeVm != null)
{
int index = Utils.ServerVmIndexof(config.vmess, activeVm);
if (index >= 0) config.index = index; // restore to the correct value
}
} }
//刷新 //刷新
RefreshServers(); RefreshServers();
@ -610,11 +652,9 @@ namespace v2rayN.Forms
private void menuCopyServer_Click(object sender, EventArgs e) private void menuCopyServer_Click(object sender, EventArgs e)
{ {
int index = GetLvSelectedIndex(); int index = GetConfigIndexFromServerListSelected();
if (index < 0) if (index < 0) return;
{
return;
}
if (ConfigHandler.CopyServer(ref config, index) == 0) if (ConfigHandler.CopyServer(ref config, index) == 0)
{ {
//刷新 //刷新
@ -624,11 +664,9 @@ namespace v2rayN.Forms
private void menuSetDefaultServer_Click(object sender, EventArgs e) private void menuSetDefaultServer_Click(object sender, EventArgs e)
{ {
int index = GetLvSelectedIndex(); int index = GetConfigIndexFromServerListSelected();
if (index < 0) if (index < 0) return;
{
return;
}
SetDefaultServer(index); SetDefaultServer(index);
} }
@ -669,37 +707,37 @@ namespace v2rayN.Forms
} }
private void Speedtest(string actionType) private void Speedtest(string actionType)
{ {
if (GetLvSelectedIndex() < 0) return; if (GetConfigIndexFromServerListSelected() < 0) return;
ClearTestResult(); ClearTestResult();
SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, actionType, UpdateSpeedtestHandler); SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, actionType, UpdateSpeedtestHandler);
} }
private void tsbTestMe_Click(object sender, EventArgs e) private async void menuTestMe_Click(object sender, EventArgs e)
{ {
string result = httpProxyTest() + "ms"; string result = await httpProxyTest() + "ms";
AppendText(false, string.Format(UIRes.I18N("TestMeOutput"), result)); AppendText(false, string.Format(UIRes.I18N("TestMeOutput"), result));
} }
private int httpProxyTest() private async Task<int> httpProxyTest()
{ {
SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "", UpdateSpeedtestHandler); SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "", UpdateSpeedtestHandler);
return statistics.RunAvailabilityCheck(); return await Task.Run(() => statistics.RunAvailabilityCheck());
} }
private void menuExport2ClientConfig_Click(object sender, EventArgs e) private void menuExport2ClientConfig_Click(object sender, EventArgs e)
{ {
int index = GetLvSelectedIndex(); int index = GetConfigIndexFromServerListSelected();
MainFormHandler.Instance.Export2ClientConfig(index, config); MainFormHandler.Instance.Export2ClientConfig(index, config);
} }
private void menuExport2ServerConfig_Click(object sender, EventArgs e) private void menuExport2ServerConfig_Click(object sender, EventArgs e)
{ {
int index = GetLvSelectedIndex(); int index = GetConfigIndexFromServerListSelected();
MainFormHandler.Instance.Export2ServerConfig(index, config); MainFormHandler.Instance.Export2ServerConfig(index, config);
} }
private void menuExport2ShareUrl_Click(object sender, EventArgs e) private void menuExport2ShareUrl_Click(object sender, EventArgs e)
{ {
GetLvSelectedIndex(); GetConfigIndexFromServerListSelected();
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
foreach (int v in lvSelecteds) foreach (int v in lvSelecteds)
@ -722,7 +760,7 @@ namespace v2rayN.Forms
private void menuExport2SubContent_Click(object sender, EventArgs e) private void menuExport2SubContent_Click(object sender, EventArgs e)
{ {
GetLvSelectedIndex(); GetConfigIndexFromServerListSelected();
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
foreach (int v in lvSelecteds) foreach (int v in lvSelecteds)
@ -744,13 +782,20 @@ namespace v2rayN.Forms
private void tsbOptionSetting_Click(object sender, EventArgs e) private void tsbOptionSetting_Click(object sender, EventArgs e)
{ {
OptionSettingForm fm = new OptionSettingForm(); string tab = "";
if (sender == toolSslRouting) tab = "tabPreDefinedRules";
OptionSettingForm fm = new OptionSettingForm(tab);
if (fm.ShowDialog() == DialogResult.OK) if (fm.ShowDialog() == DialogResult.OK)
{ {
//刷新 //刷新
RefreshServers(); RefreshServers();
LoadV2ray(); //Application.DoEvents();
HttpProxyHandle.RestartHttpAgent(config, true); Task.Run(() =>
{
LoadV2ray();
HttpProxyHandle.RestartHttpAgent(config, true);
});
} }
} }
@ -783,15 +828,19 @@ namespace v2rayN.Forms
//刷新 //刷新
RefreshServers(); RefreshServers();
LoadV2ray(); LoadV2ray();
toolSslServerLatencySet();
} }
return 0; return 0;
} }
/// <summary> /// <summary>
/// 取得ListView选中的行 /// 获取服务器列表选中行的配置项config索引index
///
/// 返回值对应首个选中项,无选中或出错时返回-1
/// 访问多选请在调用此函数后访问 lvSelecteds
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
private int GetLvSelectedIndex() private int GetConfigIndexFromServerListSelected()
{ {
int index = -1; int index = -1;
lvSelecteds.Clear(); lvSelecteds.Clear();
@ -803,9 +852,11 @@ namespace v2rayN.Forms
return index; return index;
} }
index = lvServers.SelectedIndices[0]; index = Convert.ToInt32(lvServers.SelectedItems[0].Tag);
foreach (int i in lvServers.SelectedIndices)
foreach (int item in lvServers.SelectedIndices)
{ {
int i = Convert.ToInt32(lvServers.Items[item].Tag);
lvSelecteds.Add(i); lvSelecteds.Add(i);
} }
return index; return index;
@ -815,6 +866,27 @@ namespace v2rayN.Forms
return index; return index;
} }
} }
/// <summary>
/// 获取服务器列表表示指定配置项的所有行的索引
/// 基于列表项的Tag属性
///
/// 出错时返回空。
/// </summary>
/// <returns></returns>
private List<int> GetServerListItemsByConfigIndex(int configIndex)
{
var l = new List<int>();
foreach (ListViewItem item in lvServers.Items)
{
string tagStr = item.Tag?.ToString();
if (int.TryParse(tagStr, out int tagInt)
&& tagInt == configIndex)
{
l.Add(item.Index);
}
}
return l;
}
private void menuAddCustomServer_Click(object sender, EventArgs e) private void menuAddCustomServer_Click(object sender, EventArgs e)
{ {
@ -1047,12 +1119,13 @@ namespace v2rayN.Forms
#region #region
private void SetTestResult(int k, string txt) private void SetTestResult(int configIndex, string txt)
{ {
if (k < lvServers.Items.Count) var l = GetServerListItemsByConfigIndex(configIndex);
if (l.Count > 0)
{ {
config.vmess[k].testResult = txt; config.vmess[configIndex].testResult = txt;
lvServers.Items[k].SubItems["testResult"].Text = txt; l.ForEach((listIndex) => lvServers.Items[listIndex].SubItems["testResult"].Text = txt);
} }
} }
private void ClearTestResult() private void ClearTestResult()
@ -1076,22 +1149,28 @@ namespace v2rayN.Forms
{ {
up /= (ulong)(config.statisticsFreshRate / 1000f); up /= (ulong)(config.statisticsFreshRate / 1000f);
down /= (ulong)(config.statisticsFreshRate / 1000f); down /= (ulong)(config.statisticsFreshRate / 1000f);
toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); this.Invoke((MethodInvoker)(delegate
{
List<string[]> datas = new List<string[]>(); toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down));
}));
for (int i = 0; i < config.vmess.Count; i++) for (int i = 0; i < config.vmess.Count; i++)
{ {
int index = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId()); int statsIndex = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId());
if (index != -1) List<int> l = GetServerListItemsByConfigIndex(i);
if (statsIndex != -1 && l.Count > 0)
{ {
lvServers.Invoke((MethodInvoker)delegate this?.Invoke((MethodInvoker)delegate
{ {
lvServers.BeginUpdate(); lvServers.BeginUpdate();
lvServers.Items[i].SubItems["todayDown"].Text = Utils.HumanFy(statistics[index].todayDown); l.ForEach((listIndex) =>
lvServers.Items[i].SubItems["todayUp"].Text = Utils.HumanFy(statistics[index].todayUp); {
lvServers.Items[i].SubItems["totalDown"].Text = Utils.HumanFy(statistics[index].totalDown); lvServers.Items[listIndex].SubItems["todayDown"].Text = Utils.HumanFy(statistics[statsIndex].todayDown);
lvServers.Items[i].SubItems["totalUp"].Text = Utils.HumanFy(statistics[index].totalUp); lvServers.Items[listIndex].SubItems["todayUp"].Text = Utils.HumanFy(statistics[statsIndex].todayUp);
lvServers.Items[listIndex].SubItems["totalDown"].Text = Utils.HumanFy(statistics[statsIndex].totalDown);
lvServers.Items[listIndex].SubItems["totalUp"].Text = Utils.HumanFy(statistics[statsIndex].totalUp);
});
lvServers.EndUpdate(); lvServers.EndUpdate();
}); });
@ -1130,7 +1209,7 @@ namespace v2rayN.Forms
private void MoveServer(EMove eMove) private void MoveServer(EMove eMove)
{ {
int index = GetLvSelectedIndex(); int index = GetConfigIndexFromServerListSelected();
if (index < 0) if (index < 0)
{ {
UI.Show(UIRes.I18N("PleaseSelectServer")); UI.Show(UIRes.I18N("PleaseSelectServer"));
@ -1211,8 +1290,13 @@ namespace v2rayN.Forms
item.Checked = ((int)type == k); item.Checked = ((int)type == k);
} }
ConfigHandler.SaveConfig(ref config, false); Global.reloadV2ray = false;
DisplayToolStatus(); ConfigHandler.SaveConfigToFile(ref config);
this.Invoke((MethodInvoker)(delegate
{
DisplayToolStatus();
}));
} }
#endregion #endregion
@ -1220,11 +1304,11 @@ namespace v2rayN.Forms
#region CheckUpdate #region CheckUpdate
private void askToDownload(DownloadHandle downloadHandle, string url) private async void askToDownload(DownloadHandle downloadHandle, string url)
{ {
if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.Yes) if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.Yes)
{ {
if (httpProxyTest() > 0) if (await httpProxyTest() > 0)
{ {
int httpPort = config.GetLocalPort(Global.InboundHttp); int httpPort = config.GetLocalPort(Global.InboundHttp);
WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); WebProxy webProxy = new WebProxy(Global.Loopback, httpPort);
@ -1327,7 +1411,7 @@ namespace v2rayN.Forms
try try
{ {
CloseV2ray(); Closes();
string fileName = downloadHandle.DownloadFileName; string fileName = downloadHandle.DownloadFileName;
fileName = Utils.GetPath(fileName); fileName = Utils.GetPath(fileName);
@ -1390,7 +1474,8 @@ namespace v2rayN.Forms
}; };
} }
AppendText(false, UIRes.I18N("MsgStartUpdatingPAC")); AppendText(false, UIRes.I18N("MsgStartUpdatingPAC"));
pacListHandle.WebDownloadString(config.urlGFWList); string url = Utils.IsNullOrEmpty(config.urlGFWList) ? Global.GFWLIST_URL : config.urlGFWList;
pacListHandle.WebDownloadString(url);
} }
private void tsbCheckClearPACList_Click(object sender, EventArgs e) private void tsbCheckClearPACList_Click(object sender, EventArgs e)
@ -1503,7 +1588,7 @@ namespace v2rayN.Forms
{ {
if (args.Success) if (args.Success)
{ {
AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); //AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}");
string result = Utils.Base64Decode(args.Msg); string result = Utils.Base64Decode(args.Msg);
if (Utils.IsNullOrEmpty(result)) if (Utils.IsNullOrEmpty(result))
{ {
@ -1542,6 +1627,7 @@ namespace v2rayN.Forms
{ {
bool bShow = tsbQRCodeSwitch.Checked; bool bShow = tsbQRCodeSwitch.Checked;
scMain.Panel2Collapsed = !bShow; scMain.Panel2Collapsed = !bShow;
RefreshQRCodePanel();
} }
#endregion #endregion
@ -1563,8 +1649,100 @@ namespace v2rayN.Forms
} }
#endregion #endregion
private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
{
RefreshTaryIcon();
}
private async void toolSslServerLatencyRefresh()
{
toolSslServerLatencySet(UIRes.I18N("ServerLatencyChecking"));
string result = await httpProxyTest() + "ms";
toolSslServerLatencySet(result);
}
private void toolSslServerLatencySet(string text = "")
{
toolSslServerLatency.Text = string.Format(UIRes.I18N("toolSslServerLatency"), text);
}
private void toolSslServerLatency_Click(object sender, EventArgs e)
{
toolSslServerLatencyRefresh();
}
private void toolSslServerSpeed_Click(object sender, EventArgs e)
{
//toolSslServerLatencyRefresh();
}
private void toolSslRouting_Click(object sender, EventArgs e)
{
tsbOptionSetting_Click(toolSslRouting, null);
}
private int lastSortedColIndex = -1;
private bool lastSortedColDirection = false;
private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e)
{
Sorter s = (Sorter)lvServers.ListViewItemSorter;
s.Column = e.Column;
int doIntSort;
bool isNum = lvServers.Columns[e.Column].Tag?.ToString() == Global.sortMode.Numeric.ToString();
if (lastSortedColIndex < 0 // 首次
|| (lastSortedColIndex >= 0 && lastSortedColIndex != e.Column) // 排序了其他列
|| (lastSortedColIndex == e.Column && !lastSortedColDirection) // 已排序
)
{
lastSortedColDirection = true;
doIntSort = isNum ? 1 : -1; // 正序
}
else
{
lastSortedColDirection = false;
doIntSort = isNum ? 2 : -2; // 倒序
}
lastSortedColIndex = e.Column;
s.Sorting = doIntSort;
lvServers.Sort();
reInterlaceColoring();
}
private void reInterlaceColoring()
{
if (!config.interlaceColoring) return;
for (int k = 0; k < lvServers.Items.Count; k++)
{
if (config.interlaceColoring && k % 2 == 1)
lvServers.Items[k].BackColor = SystemColors.Control;
else
lvServers.Items[k].BackColor = lvServers.BackColor;
}
}
private void lvServers_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
{
ColumnHeader c = lvServers.Columns[e.ColumnIndex];
ConfigHandler.AddformMainLvColWidth(ref config, c.Name, c.Width);
Task.Run(() => ConfigHandler.SaveConfigToFile(ref config));
}
private void MainForm_ResizeEnd(object sender, EventArgs e)
{
config.uiItem.mainSize = new Size(this.Width, this.Height);
Task.Run(() => ConfigHandler.SaveConfigToFile(ref config));
}
private async void lvServers_ColumnReordered(object sender, ColumnReorderedEventArgs e)
{
await Task.Delay(500);
var names = (from col in lvServers.Columns.Cast<ColumnHeader>()
orderby col.DisplayIndex
select col.Name).ToList();
config.uiItem.mainLvColLayout = names;
_ = Task.Run(() => ConfigHandler.SaveConfigToFile(ref config));
}
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -118,23 +118,34 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="menuAddVmessServer.Size" type="System.Drawing.Size, System.Drawing"> <data name="cmsLv.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value> <value>301, 534</value>
</data> </data>
<data name="menuAddVmessServer.Text" xml:space="preserve"> <data name="cmsMain.Size" type="System.Drawing.Size, System.Drawing">
<value>添加[VMess]服务器</value> <value>196, 164</value>
</data> </data>
<data name="menuAddShadowsocksServer.Size" type="System.Drawing.Size, System.Drawing"> <data name="groupBox1.Text" xml:space="preserve">
<value>300, 22</value> <value>服务器列表</value>
</data> </data>
<data name="menuAddShadowsocksServer.Text" xml:space="preserve"> <data name="groupBox2.Text" xml:space="preserve">
<value>添加[Shadowsocks]服务器</value> <value>信息</value>
</data> </data>
<data name="menuAddSocksServer.Size" type="System.Drawing.Size, System.Drawing"> <data name="lvServers.Items" mimetype="application/x-microsoft.net.object.binary.base64">
<value>300, 22</value> <value>
</data> AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
<data name="menuAddSocksServer.Text" xml:space="preserve"> LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
<value>添加[Socks]服务器</value> ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
</value>
</data> </data>
<data name="menuAddCustomServer.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuAddCustomServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value> <value>300, 22</value>
@ -148,26 +159,35 @@
<data name="menuAddServers.Text" xml:space="preserve"> <data name="menuAddServers.Text" xml:space="preserve">
<value>从剪贴板导入批量URL (Ctrl+V)</value> <value>从剪贴板导入批量URL (Ctrl+V)</value>
</data> </data>
<data name="menuScanScreen.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuAddServers2.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value>
</data>
<data name="menuAddServers2.Text" xml:space="preserve">
<value>从剪贴板导入批量URL</value>
</data>
<data name="menuAddShadowsocksServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value> <value>300, 22</value>
</data> </data>
<data name="menuScanScreen.Text" xml:space="preserve"> <data name="menuAddShadowsocksServer.Text" xml:space="preserve">
<value>扫描屏幕上的二维码 (Ctrl+S)</value> <value>添加[Shadowsocks]服务器</value>
</data> </data>
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuAddSocksServer.Size" type="System.Drawing.Size, System.Drawing">
<value>297, 6</value>
</data>
<data name="menuRemoveServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value> <value>300, 22</value>
</data> </data>
<data name="menuRemoveServer.Text" xml:space="preserve"> <data name="menuAddSocksServer.Text" xml:space="preserve">
<value>移除所选服务器(多选) (Delete)</value> <value>添加[Socks]服务器</value>
</data> </data>
<data name="menuRemoveDuplicateServer.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuAddVmessServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value> <value>300, 22</value>
</data> </data>
<data name="menuRemoveDuplicateServer.Text" xml:space="preserve"> <data name="menuAddVmessServer.Text" xml:space="preserve">
<value>移除重复的服务器</value> <value>添加[VMess]服务器</value>
</data>
<data name="menuCopyPACUrl.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value>
</data>
<data name="menuCopyPACUrl.Text" xml:space="preserve">
<value>复制本地PAC网址</value>
</data> </data>
<data name="menuCopyServer.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuCopyServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value> <value>300, 22</value>
@ -175,74 +195,11 @@
<data name="menuCopyServer.Text" xml:space="preserve"> <data name="menuCopyServer.Text" xml:space="preserve">
<value>克隆所选服务器</value> <value>克隆所选服务器</value>
</data> </data>
<data name="menuSetDefaultServer.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuExit.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value> <value>195, 22</value>
</data> </data>
<data name="menuSetDefaultServer.Text" xml:space="preserve"> <data name="menuExit.Text" xml:space="preserve">
<value>设为活动服务器 (Enter)</value> <value>退出</value>
</data>
<data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
<value>297, 6</value>
</data>
<data name="menuMoveTop.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuMoveTop.Text" xml:space="preserve">
<value>上移至顶 (T)</value>
</data>
<data name="menuMoveUp.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuMoveUp.Text" xml:space="preserve">
<value>上移 (U)</value>
</data>
<data name="menuMoveDown.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuMoveDown.Text" xml:space="preserve">
<value>下移 (D)</value>
</data>
<data name="menuMoveBottom.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuMoveBottom.Text" xml:space="preserve">
<value>下移至底 (B)</value>
</data>
<data name="menuSelectAll.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuSelectAll.Text" xml:space="preserve">
<value>全选 (Ctrl+A)</value>
</data>
<data name="toolStripSeparator9.Size" type="System.Drawing.Size, System.Drawing">
<value>297, 6</value>
</data>
<data name="menuPingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuPingServer.Text" xml:space="preserve">
<value>测试服务器延迟Ping(多选) (Ctrl+P)</value>
</data>
<data name="menuTcpingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuTcpingServer.Text" xml:space="preserve">
<value>测试服务器延迟Tcping(多选) (Ctrl+O)</value>
</data>
<data name="menuRealPingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuRealPingServer.Text" xml:space="preserve">
<value>测试服务器真连接延迟(多选) (Ctrl+R)</value>
</data>
<data name="menuSpeedServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuSpeedServer.Text" xml:space="preserve">
<value>测试服务器速度(多选) (Ctrl+T)</value>
</data>
<data name="toolStripSeparator6.Size" type="System.Drawing.Size, System.Drawing">
<value>297, 6</value>
</data> </data>
<data name="menuExport2ClientConfig.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuExport2ClientConfig.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value> <value>300, 22</value>
@ -268,38 +225,6 @@
<data name="menuExport2SubContent.Text" xml:space="preserve"> <data name="menuExport2SubContent.Text" xml:space="preserve">
<value>批量导出订阅内容至剪贴板(多选)</value> <value>批量导出订阅内容至剪贴板(多选)</value>
</data> </data>
<data name="tsbServer.Size" type="System.Drawing.Size, System.Drawing">
<value>73, 53</value>
</data>
<data name="tsbServer.Text" xml:space="preserve">
<value> 服务器 </value>
</data>
<data name="cmsLv.Size" type="System.Drawing.Size, System.Drawing">
<value>301, 534</value>
</data>
<data name="lvServers.Items" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
</value>
</data>
<data name="menuNotEnabledHttp.Size" type="System.Drawing.Size, System.Drawing">
<value>316, 22</value>
</data>
<data name="menuNotEnabledHttp.Text" xml:space="preserve">
<value>关闭Http代理</value>
</data>
<data name="menuGlobal.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuGlobal.Size" type="System.Drawing.Size, System.Drawing">
<value>316, 22</value> <value>316, 22</value>
</data> </data>
@ -318,41 +243,83 @@
<data name="menuKeep.Text" xml:space="preserve"> <data name="menuKeep.Text" xml:space="preserve">
<value>仅开启Http代理,并清除系统代理</value> <value>仅开启Http代理,并清除系统代理</value>
</data> </data>
<data name="menuKeepPAC.Size" type="System.Drawing.Size, System.Drawing">
<value>316, 22</value>
</data>
<data name="menuKeepPAC.Text" xml:space="preserve">
<value>仅开启PAC,并清除系统代理</value>
</data>
<data name="menuKeepNothing.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuKeepNothing.Size" type="System.Drawing.Size, System.Drawing">
<value>316, 22</value> <value>316, 22</value>
</data> </data>
<data name="menuKeepNothing.Text" xml:space="preserve"> <data name="menuKeepNothing.Text" xml:space="preserve">
<value>仅开启Http代理,不改变系统代理</value> <value>仅开启Http代理,不改变系统代理</value>
</data> </data>
<data name="menuKeepPAC.Size" type="System.Drawing.Size, System.Drawing">
<value>316, 22</value>
</data>
<data name="menuKeepPAC.Text" xml:space="preserve">
<value>仅开启PAC,并清除系统代理</value>
</data>
<data name="menuKeepPACNothing.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuKeepPACNothing.Size" type="System.Drawing.Size, System.Drawing">
<value>316, 22</value> <value>316, 22</value>
</data> </data>
<data name="menuKeepPACNothing.Text" xml:space="preserve"> <data name="menuKeepPACNothing.Text" xml:space="preserve">
<value>仅开启PAC,不改变系统代理</value> <value>仅开启PAC,不改变系统代理</value>
</data> </data>
<data name="menuSysAgentMode.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuMoveBottom.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value> <value>300, 22</value>
</data> </data>
<data name="menuSysAgentMode.Text" xml:space="preserve"> <data name="menuMoveBottom.Text" xml:space="preserve">
<value>Http代理</value> <value>下移至底 (B)</value>
</data> </data>
<data name="menuServers.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuMoveDown.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value> <value>300, 22</value>
</data> </data>
<data name="menuServers.Text" xml:space="preserve"> <data name="menuMoveDown.Text" xml:space="preserve">
<value>服务器</value> <value>下移 (D)</value>
</data> </data>
<data name="menuAddServers2.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuMoveTop.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value> <value>300, 22</value>
</data> </data>
<data name="menuAddServers2.Text" xml:space="preserve"> <data name="menuMoveTop.Text" xml:space="preserve">
<value>从剪贴板导入批量URL</value> <value>上移至顶 (T)</value>
</data>
<data name="menuMoveUp.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuMoveUp.Text" xml:space="preserve">
<value>上移 (U)</value>
</data>
<data name="menuNotEnabledHttp.Size" type="System.Drawing.Size, System.Drawing">
<value>316, 22</value>
</data>
<data name="menuNotEnabledHttp.Text" xml:space="preserve">
<value>关闭Http代理</value>
</data>
<data name="menuPingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuPingServer.Text" xml:space="preserve">
<value>测试服务器延迟Ping(多选) (Ctrl+P)</value>
</data>
<data name="menuRealPingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuRealPingServer.Text" xml:space="preserve">
<value>测试服务器真连接延迟(多选) (Ctrl+R)</value>
</data>
<data name="menuRemoveDuplicateServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuRemoveDuplicateServer.Text" xml:space="preserve">
<value>移除重复的服务器</value>
</data>
<data name="menuRemoveServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuRemoveServer.Text" xml:space="preserve">
<value>移除所选服务器(多选) (Delete)</value>
</data>
<data name="menuScanScreen.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuScanScreen.Text" xml:space="preserve">
<value>扫描屏幕上的二维码 (Ctrl+S)</value>
</data> </data>
<data name="menuScanScreen2.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuScanScreen2.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value> <value>195, 22</value>
@ -360,11 +327,44 @@
<data name="menuScanScreen2.Text" xml:space="preserve"> <data name="menuScanScreen2.Text" xml:space="preserve">
<value>扫描屏幕上的二维码</value> <value>扫描屏幕上的二维码</value>
</data> </data>
<data name="menuCopyPACUrl.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuSelectAll.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuSelectAll.Text" xml:space="preserve">
<value>全选 (Ctrl+A)</value>
</data>
<data name="menuServers.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value> <value>195, 22</value>
</data> </data>
<data name="menuCopyPACUrl.Text" xml:space="preserve"> <data name="menuServers.Text" xml:space="preserve">
<value>复制本地PAC网址</value> <value>服务器</value>
</data>
<data name="menuSetDefaultServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuSetDefaultServer.Text" xml:space="preserve">
<value>设为活动服务器 (Enter)</value>
</data>
<data name="menuSpeedServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuSpeedServer.Text" xml:space="preserve">
<value>测试服务器速度(多选) (Ctrl+T)</value>
</data>
<data name="menuSysAgentMode.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value>
</data>
<data name="menuSysAgentMode.Text" xml:space="preserve">
<value>Http代理</value>
</data>
<data name="menuTcpingServer.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 22</value>
</data>
<data name="menuTcpingServer.Text" xml:space="preserve">
<value>测试服务器延迟Tcping(多选) (Ctrl+O)</value>
</data>
<data name="menuTestMe.Text" xml:space="preserve">
<value>测试当前服务节点状态</value>
</data> </data>
<data name="menuUpdateSubscriptions.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuUpdateSubscriptions.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 22</value> <value>195, 22</value>
@ -372,44 +372,90 @@
<data name="menuUpdateSubscriptions.Text" xml:space="preserve"> <data name="menuUpdateSubscriptions.Text" xml:space="preserve">
<value>更新订阅</value> <value>更新订阅</value>
</data> </data>
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolSslRouting.Text" xml:space="preserve">
<value>192, 6</value> <value>路由模式</value>
</data> </data>
<data name="menuExit.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolSslRouting.ToolTipText" xml:space="preserve">
<value>195, 22</value> <value>Core 路由模式(预定义规则)</value>
</data> </data>
<data name="menuExit.Text" xml:space="preserve"> <data name="toolSslServerLatency.Text" xml:space="preserve">
<value>退出</value> <value>延迟:</value>
</data> </data>
<data name="cmsMain.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolSslServerLatency.ToolTipText" xml:space="preserve">
<value>196, 164</value> <value>当前 HTTP 代理的访问延迟。</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>服务器列表</value>
</data> </data>
<data name="toolSslServerSpeed.Text" xml:space="preserve"> <data name="toolSslServerSpeed.Text" xml:space="preserve">
<value>网速显示未启用</value> <value>网速显示未启用</value>
</data> </data>
<data name="groupBox2.Text" xml:space="preserve"> <data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
<value>信息</value> <value>297, 6</value>
</data> </data>
<data name="tsbSubSetting.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolStripSeparator13.Size" type="System.Drawing.Size, System.Drawing">
<value>124, 22</value> <value>220, 6</value>
</data> </data>
<data name="tsbSubSetting.Text" xml:space="preserve"> <data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
<value>订阅设置</value> <value>192, 6</value>
</data> </data>
<data name="tsbSubUpdate.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
<value>124, 22</value> <value>297, 6</value>
</data> </data>
<data name="tsbSubUpdate.Text" xml:space="preserve"> <data name="toolStripSeparator6.Size" type="System.Drawing.Size, System.Drawing">
<value>更新订阅</value> <value>297, 6</value>
</data> </data>
<data name="tsbSub.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolStripSeparator9.Size" type="System.Drawing.Size, System.Drawing">
<value>61, 53</value> <value>297, 6</value>
</data> </data>
<data name="tsbSub.Text" xml:space="preserve"> <data name="tsbAbout.Text" xml:space="preserve">
<value> 订阅 </value> <value>v2rayN 项目</value>
</data>
<data name="tsbCheckClearPACList.Size" type="System.Drawing.Size, System.Drawing">
<value>223, 22</value>
</data>
<data name="tsbCheckClearPACList.Text" xml:space="preserve">
<value>将PAC改为直连Core按路由规则处理</value>
</data>
<data name="tsbCheckUpdate.Size" type="System.Drawing.Size, System.Drawing">
<value>85, 53</value>
</data>
<data name="tsbCheckUpdate.Text" xml:space="preserve">
<value> 检查更新 </value>
</data>
<data name="tsbCheckUpdateCore.Size" type="System.Drawing.Size, System.Drawing">
<value>223, 22</value>
</data>
<data name="tsbCheckUpdateCore.Text" xml:space="preserve">
<value>v2rayCore</value>
</data>
<data name="tsbCheckUpdateN.Size" type="System.Drawing.Size, System.Drawing">
<value>223, 22</value>
</data>
<data name="tsbCheckUpdateN.Text" xml:space="preserve">
<value>v2rayN</value>
</data>
<data name="tsbCheckUpdatePACList.Size" type="System.Drawing.Size, System.Drawing">
<value>223, 22</value>
</data>
<data name="tsbCheckUpdatePACList.Text" xml:space="preserve">
<value>PAC</value>
</data>
<data name="tsbClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA
8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC
</value>
</data>
<data name="tsbClose.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 53</value>
</data>
<data name="tsbClose.Text" xml:space="preserve">
<value> 关闭窗口 </value>
</data>
<data name="tsbHelp.Size" type="System.Drawing.Size, System.Drawing">
<value>69, 53</value>
</data>
<data name="tsbHelp.Text" xml:space="preserve">
<value> 帮助 </value>
</data> </data>
<data name="tsbOptionSetting.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsbOptionSetting.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 53</value> <value>76, 53</value>
@ -417,17 +463,26 @@
<data name="tsbOptionSetting.Text" xml:space="preserve"> <data name="tsbOptionSetting.Text" xml:space="preserve">
<value> 参数设置 </value> <value> 参数设置 </value>
</data> </data>
<data name="tsbPromotion.Size" type="System.Drawing.Size, System.Drawing">
<value>68, 53</value>
</data>
<data name="tsbPromotion.Text" xml:space="preserve">
<value> 推广 </value>
</data>
<data name="tsbQRCodeSwitch.Text" xml:space="preserve">
<value> 分享 </value>
</data>
<data name="tsbReload.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsbReload.Size" type="System.Drawing.Size, System.Drawing">
<value>148, 22</value> <value>148, 22</value>
</data> </data>
<data name="tsbReload.Text" xml:space="preserve"> <data name="tsbReload.Text" xml:space="preserve">
<value> 重启服务 </value> <value> 重启服务 </value>
</data> </data>
<data name="tsbTestMe.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsbServer.Size" type="System.Drawing.Size, System.Drawing">
<value>148, 22</value> <value>73, 53</value>
</data> </data>
<data name="tsbTestMe.Text" xml:space="preserve"> <data name="tsbServer.Text" xml:space="preserve">
<value>测试当前服务状态</value> <value> 服务器 </value>
</data> </data>
<data name="tsbService.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="tsbService.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
@ -446,71 +501,31 @@
<data name="tsbService.Text" xml:space="preserve"> <data name="tsbService.Text" xml:space="preserve">
<value> 当前服务 </value> <value> 当前服务 </value>
</data> </data>
<data name="tsbCheckUpdateN.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsbSub.Size" type="System.Drawing.Size, System.Drawing">
<value>223, 22</value> <value>61, 53</value>
</data> </data>
<data name="tsbCheckUpdateN.Text" xml:space="preserve"> <data name="tsbSub.Text" xml:space="preserve">
<value>v2rayN</value> <value> 订阅 </value>
</data> </data>
<data name="tsbCheckUpdateCore.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsbSubSetting.Size" type="System.Drawing.Size, System.Drawing">
<value>223, 22</value> <value>124, 22</value>
</data> </data>
<data name="tsbCheckUpdateCore.Text" xml:space="preserve"> <data name="tsbSubSetting.Text" xml:space="preserve">
<value>v2rayCore</value> <value>订阅设置</value>
</data> </data>
<data name="tsbCheckUpdatePACList.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsbSubUpdate.Size" type="System.Drawing.Size, System.Drawing">
<value>223, 22</value> <value>124, 22</value>
</data> </data>
<data name="tsbCheckUpdatePACList.Text" xml:space="preserve"> <data name="tsbSubUpdate.Text" xml:space="preserve">
<value>PAC</value> <value>更新订阅</value>
</data> </data>
<data name="toolStripSeparator13.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsbTestMe.Size" type="System.Drawing.Size, System.Drawing">
<value>220, 6</value> <value>148, 22</value>
</data> </data>
<data name="tsbCheckClearPACList.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsbTestMe.Text" xml:space="preserve">
<value>223, 22</value> <value>测试当前服务状态</value>
</data>
<data name="tsbCheckClearPACList.Text" xml:space="preserve">
<value>简化PAC (请设置Core路由)</value>
</data>
<data name="tsbCheckUpdate.Size" type="System.Drawing.Size, System.Drawing">
<value>85, 53</value>
</data>
<data name="tsbCheckUpdate.Text" xml:space="preserve">
<value> 检查更新 </value>
</data>
<data name="tsbAbout.Text" xml:space="preserve">
<value>v2rayN 项目</value>
</data> </data>
<data name="tsbV2rayWebsite.Text" xml:space="preserve"> <data name="tsbV2rayWebsite.Text" xml:space="preserve">
<value>V2Ray 官网</value> <value>V2Ray 官网</value>
</data> </data>
<data name="tsbHelp.Size" type="System.Drawing.Size, System.Drawing">
<value>69, 53</value>
</data>
<data name="tsbHelp.Text" xml:space="preserve">
<value> 帮助 </value>
</data>
<data name="tsbPromotion.Size" type="System.Drawing.Size, System.Drawing">
<value>68, 53</value>
</data>
<data name="tsbPromotion.Text" xml:space="preserve">
<value> 推广 </value>
</data>
<data name="tsbClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA
8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC
</value>
</data>
<data name="tsbClose.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 53</value>
</data>
<data name="tsbClose.Text" xml:space="preserve">
<value> 关闭窗口 </value>
</data>
<data name="tsbQRCodeSwitch.Text" xml:space="preserve">
<value> 分享 </value>
</data>
</root> </root>

View file

@ -31,7 +31,7 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionSettingForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionSettingForm));
this.btnClose = new System.Windows.Forms.Button(); this.btnClose = new System.Windows.Forms.Button();
this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage(); this.tabBasic = new System.Windows.Forms.TabPage();
this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label16 = new System.Windows.Forms.Label(); this.label16 = new System.Windows.Forms.Label();
this.cmblistenerType = new System.Windows.Forms.ComboBox(); this.cmblistenerType = new System.Windows.Forms.ComboBox();
@ -53,7 +53,7 @@
this.label5 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label();
this.txtlocalPort = new System.Windows.Forms.TextBox(); this.txtlocalPort = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.tabPage2 = new System.Windows.Forms.TabPage(); this.tabRouting = new System.Windows.Forms.TabPage();
this.groupBox2 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox();
this.tabControl2 = new System.Windows.Forms.TabControl(); this.tabControl2 = new System.Windows.Forms.TabControl();
this.tabPage3 = new System.Windows.Forms.TabPage(); this.tabPage3 = new System.Windows.Forms.TabPage();
@ -62,14 +62,14 @@
this.txtUserdirect = new System.Windows.Forms.TextBox(); this.txtUserdirect = new System.Windows.Forms.TextBox();
this.tabPage5 = new System.Windows.Forms.TabPage(); this.tabPage5 = new System.Windows.Forms.TabPage();
this.txtUserblock = new System.Windows.Forms.TextBox(); this.txtUserblock = new System.Windows.Forms.TextBox();
this.tabPage8 = new System.Windows.Forms.TabPage(); this.tabPreDefinedRules = new System.Windows.Forms.TabPage();
this.cmbroutingMode = new System.Windows.Forms.ComboBox(); this.cmbroutingMode = new System.Windows.Forms.ComboBox();
this.panel3 = new System.Windows.Forms.Panel(); this.panel3 = new System.Windows.Forms.Panel();
this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel();
this.btnSetDefRountingRule = new System.Windows.Forms.Button(); this.btnSetDefRountingRule = new System.Windows.Forms.Button();
this.labRoutingTips = new System.Windows.Forms.Label(); this.labRoutingTips = new System.Windows.Forms.Label();
this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); this.cmbdomainStrategy = new System.Windows.Forms.ComboBox();
this.tabPage6 = new System.Windows.Forms.TabPage(); this.tabKCP = new System.Windows.Forms.TabPage();
this.chkKcpcongestion = new System.Windows.Forms.CheckBox(); this.chkKcpcongestion = new System.Windows.Forms.CheckBox();
this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox(); this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox();
this.label10 = new System.Windows.Forms.Label(); this.label10 = new System.Windows.Forms.Label();
@ -83,7 +83,7 @@
this.label7 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label();
this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.txtKcpmtu = new System.Windows.Forms.TextBox();
this.label6 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label();
this.tabPage7 = new System.Windows.Forms.TabPage(); this.tabGUI = new System.Windows.Forms.TabPage();
this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox(); this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox();
this.cbFreshrate = new System.Windows.Forms.ComboBox(); this.cbFreshrate = new System.Windows.Forms.ComboBox();
this.lbFreshrate = new System.Windows.Forms.Label(); this.lbFreshrate = new System.Windows.Forms.Label();
@ -92,27 +92,28 @@
this.txturlGFWList = new System.Windows.Forms.TextBox(); this.txturlGFWList = new System.Windows.Forms.TextBox();
this.label13 = new System.Windows.Forms.Label(); this.label13 = new System.Windows.Forms.Label();
this.chkAutoRun = new System.Windows.Forms.CheckBox(); this.chkAutoRun = new System.Windows.Forms.CheckBox();
this.tabPage9 = new System.Windows.Forms.TabPage(); this.tabUserPAC = new System.Windows.Forms.TabPage();
this.txtuserPacRule = new System.Windows.Forms.TextBox(); this.txtuserPacRule = new System.Windows.Forms.TextBox();
this.panel4 = new System.Windows.Forms.Panel(); this.panel4 = new System.Windows.Forms.Panel();
this.label4 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label();
this.panel2 = new System.Windows.Forms.Panel(); this.panel2 = new System.Windows.Forms.Panel();
this.btnOK = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button();
this.panel1 = new System.Windows.Forms.Panel(); this.panel1 = new System.Windows.Forms.Panel();
this.chkInterlaceColoring = new System.Windows.Forms.CheckBox();
this.tabControl1.SuspendLayout(); this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout(); this.tabBasic.SuspendLayout();
this.groupBox1.SuspendLayout(); this.groupBox1.SuspendLayout();
this.tabPage2.SuspendLayout(); this.tabRouting.SuspendLayout();
this.groupBox2.SuspendLayout(); this.groupBox2.SuspendLayout();
this.tabControl2.SuspendLayout(); this.tabControl2.SuspendLayout();
this.tabPage3.SuspendLayout(); this.tabPage3.SuspendLayout();
this.tabPage4.SuspendLayout(); this.tabPage4.SuspendLayout();
this.tabPage5.SuspendLayout(); this.tabPage5.SuspendLayout();
this.tabPage8.SuspendLayout(); this.tabPreDefinedRules.SuspendLayout();
this.panel3.SuspendLayout(); this.panel3.SuspendLayout();
this.tabPage6.SuspendLayout(); this.tabKCP.SuspendLayout();
this.tabPage7.SuspendLayout(); this.tabGUI.SuspendLayout();
this.tabPage9.SuspendLayout(); this.tabUserPAC.SuspendLayout();
this.panel4.SuspendLayout(); this.panel4.SuspendLayout();
this.panel2.SuspendLayout(); this.panel2.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
@ -127,21 +128,21 @@
// //
// tabControl1 // tabControl1
// //
this.tabControl1.Controls.Add(this.tabPage1); this.tabControl1.Controls.Add(this.tabBasic);
this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Controls.Add(this.tabRouting);
this.tabControl1.Controls.Add(this.tabPage6); this.tabControl1.Controls.Add(this.tabKCP);
this.tabControl1.Controls.Add(this.tabPage7); this.tabControl1.Controls.Add(this.tabGUI);
this.tabControl1.Controls.Add(this.tabPage9); this.tabControl1.Controls.Add(this.tabUserPAC);
resources.ApplyResources(this.tabControl1, "tabControl1"); resources.ApplyResources(this.tabControl1, "tabControl1");
this.tabControl1.Name = "tabControl1"; this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0; this.tabControl1.SelectedIndex = 0;
// //
// tabPage1 // tabBasic
// //
this.tabPage1.Controls.Add(this.groupBox1); this.tabBasic.Controls.Add(this.groupBox1);
resources.ApplyResources(this.tabPage1, "tabPage1"); resources.ApplyResources(this.tabBasic, "tabBasic");
this.tabPage1.Name = "tabPage1"; this.tabBasic.Name = "tabBasic";
this.tabPage1.UseVisualStyleBackColor = true; this.tabBasic.UseVisualStyleBackColor = true;
// //
// groupBox1 // groupBox1
// //
@ -305,12 +306,12 @@
resources.ApplyResources(this.label2, "label2"); resources.ApplyResources(this.label2, "label2");
this.label2.Name = "label2"; this.label2.Name = "label2";
// //
// tabPage2 // tabRouting
// //
this.tabPage2.Controls.Add(this.groupBox2); this.tabRouting.Controls.Add(this.groupBox2);
resources.ApplyResources(this.tabPage2, "tabPage2"); resources.ApplyResources(this.tabRouting, "tabRouting");
this.tabPage2.Name = "tabPage2"; this.tabRouting.Name = "tabRouting";
this.tabPage2.UseVisualStyleBackColor = true; this.tabRouting.UseVisualStyleBackColor = true;
// //
// groupBox2 // groupBox2
// //
@ -325,7 +326,7 @@
this.tabControl2.Controls.Add(this.tabPage3); this.tabControl2.Controls.Add(this.tabPage3);
this.tabControl2.Controls.Add(this.tabPage4); this.tabControl2.Controls.Add(this.tabPage4);
this.tabControl2.Controls.Add(this.tabPage5); this.tabControl2.Controls.Add(this.tabPage5);
this.tabControl2.Controls.Add(this.tabPage8); this.tabControl2.Controls.Add(this.tabPreDefinedRules);
resources.ApplyResources(this.tabControl2, "tabControl2"); resources.ApplyResources(this.tabControl2, "tabControl2");
this.tabControl2.Name = "tabControl2"; this.tabControl2.Name = "tabControl2";
this.tabControl2.SelectedIndex = 0; this.tabControl2.SelectedIndex = 0;
@ -366,12 +367,12 @@
resources.ApplyResources(this.txtUserblock, "txtUserblock"); resources.ApplyResources(this.txtUserblock, "txtUserblock");
this.txtUserblock.Name = "txtUserblock"; this.txtUserblock.Name = "txtUserblock";
// //
// tabPage8 // tabPreDefinedRules
// //
this.tabPage8.Controls.Add(this.cmbroutingMode); this.tabPreDefinedRules.Controls.Add(this.cmbroutingMode);
resources.ApplyResources(this.tabPage8, "tabPage8"); resources.ApplyResources(this.tabPreDefinedRules, "tabPreDefinedRules");
this.tabPage8.Name = "tabPage8"; this.tabPreDefinedRules.Name = "tabPreDefinedRules";
this.tabPage8.UseVisualStyleBackColor = true; this.tabPreDefinedRules.UseVisualStyleBackColor = true;
// //
// cmbroutingMode // cmbroutingMode
// //
@ -425,24 +426,24 @@
resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy");
this.cmbdomainStrategy.Name = "cmbdomainStrategy"; this.cmbdomainStrategy.Name = "cmbdomainStrategy";
// //
// tabPage6 // tabKCP
// //
this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabKCP.Controls.Add(this.chkKcpcongestion);
this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabKCP.Controls.Add(this.txtKcpwriteBufferSize);
this.tabPage6.Controls.Add(this.label10); this.tabKCP.Controls.Add(this.label10);
this.tabPage6.Controls.Add(this.txtKcpreadBufferSize); this.tabKCP.Controls.Add(this.txtKcpreadBufferSize);
this.tabPage6.Controls.Add(this.label11); this.tabKCP.Controls.Add(this.label11);
this.tabPage6.Controls.Add(this.txtKcpdownlinkCapacity); this.tabKCP.Controls.Add(this.txtKcpdownlinkCapacity);
this.tabPage6.Controls.Add(this.label8); this.tabKCP.Controls.Add(this.label8);
this.tabPage6.Controls.Add(this.txtKcpuplinkCapacity); this.tabKCP.Controls.Add(this.txtKcpuplinkCapacity);
this.tabPage6.Controls.Add(this.label9); this.tabKCP.Controls.Add(this.label9);
this.tabPage6.Controls.Add(this.txtKcptti); this.tabKCP.Controls.Add(this.txtKcptti);
this.tabPage6.Controls.Add(this.label7); this.tabKCP.Controls.Add(this.label7);
this.tabPage6.Controls.Add(this.txtKcpmtu); this.tabKCP.Controls.Add(this.txtKcpmtu);
this.tabPage6.Controls.Add(this.label6); this.tabKCP.Controls.Add(this.label6);
resources.ApplyResources(this.tabPage6, "tabPage6"); resources.ApplyResources(this.tabKCP, "tabKCP");
this.tabPage6.Name = "tabPage6"; this.tabKCP.Name = "tabKCP";
this.tabPage6.UseVisualStyleBackColor = true; this.tabKCP.UseVisualStyleBackColor = true;
// //
// chkKcpcongestion // chkKcpcongestion
// //
@ -510,19 +511,20 @@
resources.ApplyResources(this.label6, "label6"); resources.ApplyResources(this.label6, "label6");
this.label6.Name = "label6"; this.label6.Name = "label6";
// //
// tabPage7 // tabGUI
// //
this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); this.tabGUI.Controls.Add(this.chkInterlaceColoring);
this.tabPage7.Controls.Add(this.cbFreshrate); this.tabGUI.Controls.Add(this.chkKeepOlderDedupl);
this.tabPage7.Controls.Add(this.lbFreshrate); this.tabGUI.Controls.Add(this.cbFreshrate);
this.tabPage7.Controls.Add(this.chkEnableStatistics); this.tabGUI.Controls.Add(this.lbFreshrate);
this.tabPage7.Controls.Add(this.chkAllowLANConn); this.tabGUI.Controls.Add(this.chkEnableStatistics);
this.tabPage7.Controls.Add(this.txturlGFWList); this.tabGUI.Controls.Add(this.chkAllowLANConn);
this.tabPage7.Controls.Add(this.label13); this.tabGUI.Controls.Add(this.txturlGFWList);
this.tabPage7.Controls.Add(this.chkAutoRun); this.tabGUI.Controls.Add(this.label13);
resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabGUI.Controls.Add(this.chkAutoRun);
this.tabPage7.Name = "tabPage7"; resources.ApplyResources(this.tabGUI, "tabGUI");
this.tabPage7.UseVisualStyleBackColor = true; this.tabGUI.Name = "tabGUI";
this.tabGUI.UseVisualStyleBackColor = true;
// //
// chkKeepOlderDedupl // chkKeepOlderDedupl
// //
@ -570,13 +572,13 @@
this.chkAutoRun.Name = "chkAutoRun"; this.chkAutoRun.Name = "chkAutoRun";
this.chkAutoRun.UseVisualStyleBackColor = true; this.chkAutoRun.UseVisualStyleBackColor = true;
// //
// tabPage9 // tabUserPAC
// //
this.tabPage9.Controls.Add(this.txtuserPacRule); this.tabUserPAC.Controls.Add(this.txtuserPacRule);
this.tabPage9.Controls.Add(this.panel4); this.tabUserPAC.Controls.Add(this.panel4);
resources.ApplyResources(this.tabPage9, "tabPage9"); resources.ApplyResources(this.tabUserPAC, "tabUserPAC");
this.tabPage9.Name = "tabPage9"; this.tabUserPAC.Name = "tabUserPAC";
this.tabPage9.UseVisualStyleBackColor = true; this.tabUserPAC.UseVisualStyleBackColor = true;
// //
// txtuserPacRule // txtuserPacRule
// //
@ -614,6 +616,12 @@
resources.ApplyResources(this.panel1, "panel1"); resources.ApplyResources(this.panel1, "panel1");
this.panel1.Name = "panel1"; this.panel1.Name = "panel1";
// //
// chkInterlaceColoring
//
resources.ApplyResources(this.chkInterlaceColoring, "chkInterlaceColoring");
this.chkInterlaceColoring.Name = "chkInterlaceColoring";
this.chkInterlaceColoring.UseVisualStyleBackColor = true;
//
// OptionSettingForm // OptionSettingForm
// //
resources.ApplyResources(this, "$this"); resources.ApplyResources(this, "$this");
@ -626,10 +634,10 @@
this.Name = "OptionSettingForm"; this.Name = "OptionSettingForm";
this.Load += new System.EventHandler(this.OptionSettingForm_Load); this.Load += new System.EventHandler(this.OptionSettingForm_Load);
this.tabControl1.ResumeLayout(false); this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false); this.tabBasic.ResumeLayout(false);
this.groupBox1.ResumeLayout(false); this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout(); this.groupBox1.PerformLayout();
this.tabPage2.ResumeLayout(false); this.tabRouting.ResumeLayout(false);
this.groupBox2.ResumeLayout(false); this.groupBox2.ResumeLayout(false);
this.tabControl2.ResumeLayout(false); this.tabControl2.ResumeLayout(false);
this.tabPage3.ResumeLayout(false); this.tabPage3.ResumeLayout(false);
@ -638,15 +646,15 @@
this.tabPage4.PerformLayout(); this.tabPage4.PerformLayout();
this.tabPage5.ResumeLayout(false); this.tabPage5.ResumeLayout(false);
this.tabPage5.PerformLayout(); this.tabPage5.PerformLayout();
this.tabPage8.ResumeLayout(false); this.tabPreDefinedRules.ResumeLayout(false);
this.panel3.ResumeLayout(false); this.panel3.ResumeLayout(false);
this.panel3.PerformLayout(); this.panel3.PerformLayout();
this.tabPage6.ResumeLayout(false); this.tabKCP.ResumeLayout(false);
this.tabPage6.PerformLayout(); this.tabKCP.PerformLayout();
this.tabPage7.ResumeLayout(false); this.tabGUI.ResumeLayout(false);
this.tabPage7.PerformLayout(); this.tabGUI.PerformLayout();
this.tabPage9.ResumeLayout(false); this.tabUserPAC.ResumeLayout(false);
this.tabPage9.PerformLayout(); this.tabUserPAC.PerformLayout();
this.panel4.ResumeLayout(false); this.panel4.ResumeLayout(false);
this.panel2.ResumeLayout(false); this.panel2.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
@ -666,8 +674,8 @@
private System.Windows.Forms.CheckBox chkudpEnabled; private System.Windows.Forms.CheckBox chkudpEnabled;
private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.TabControl tabControl1; private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1; private System.Windows.Forms.TabPage tabBasic;
private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.TabPage tabRouting;
private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.ComboBox cmbprotocol; private System.Windows.Forms.ComboBox cmbprotocol;
@ -686,7 +694,7 @@
private System.Windows.Forms.TabPage tabPage5; private System.Windows.Forms.TabPage tabPage5;
private System.Windows.Forms.TextBox txtUserdirect; private System.Windows.Forms.TextBox txtUserdirect;
private System.Windows.Forms.TextBox txtUserblock; private System.Windows.Forms.TextBox txtUserblock;
private System.Windows.Forms.TabPage tabPage6; private System.Windows.Forms.TabPage tabKCP;
private System.Windows.Forms.TextBox txtKcpmtu; private System.Windows.Forms.TextBox txtKcpmtu;
private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox txtKcptti; private System.Windows.Forms.TextBox txtKcptti;
@ -700,7 +708,7 @@
private System.Windows.Forms.TextBox txtKcpuplinkCapacity; private System.Windows.Forms.TextBox txtKcpuplinkCapacity;
private System.Windows.Forms.Label label9; private System.Windows.Forms.Label label9;
private System.Windows.Forms.CheckBox chkKcpcongestion; private System.Windows.Forms.CheckBox chkKcpcongestion;
private System.Windows.Forms.TabPage tabPage7; private System.Windows.Forms.TabPage tabGUI;
private System.Windows.Forms.CheckBox chkAutoRun; private System.Windows.Forms.CheckBox chkAutoRun;
private System.Windows.Forms.Label label13; private System.Windows.Forms.Label label13;
private System.Windows.Forms.TextBox txturlGFWList; private System.Windows.Forms.TextBox txturlGFWList;
@ -718,12 +726,13 @@
private System.Windows.Forms.Label lbFreshrate; private System.Windows.Forms.Label lbFreshrate;
private System.Windows.Forms.Label label16; private System.Windows.Forms.Label label16;
private System.Windows.Forms.ComboBox cmblistenerType; private System.Windows.Forms.ComboBox cmblistenerType;
private System.Windows.Forms.TabPage tabPage8; private System.Windows.Forms.TabPage tabPreDefinedRules;
private System.Windows.Forms.TabPage tabPage9; private System.Windows.Forms.TabPage tabUserPAC;
private System.Windows.Forms.TextBox txtuserPacRule; private System.Windows.Forms.TextBox txtuserPacRule;
private System.Windows.Forms.Panel panel4; private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label4;
private System.Windows.Forms.CheckBox chkKeepOlderDedupl; private System.Windows.Forms.CheckBox chkKeepOlderDedupl;
private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; private System.Windows.Forms.LinkLabel linkLabelRoutingDoc;
private System.Windows.Forms.CheckBox chkInterlaceColoring;
} }
} }

View file

@ -9,8 +9,10 @@ namespace v2rayN.Forms
{ {
public partial class OptionSettingForm : BaseForm public partial class OptionSettingForm : BaseForm
{ {
public OptionSettingForm() private string _tabOpened;
public OptionSettingForm(string tabOpened = "")
{ {
_tabOpened = tabOpened;
InitializeComponent(); InitializeComponent();
} }
@ -25,6 +27,18 @@ namespace v2rayN.Forms
InitGUI(); InitGUI();
InitUserPAC(); InitUserPAC();
var tab = tabControl1.TabPages[_tabOpened];
var tab2 = tabControl2.TabPages[_tabOpened];
if (tab != null)
{
tabControl1.SelectedTab = tab;
}
if (tab2 != null)
{
tabControl1.SelectedTab = tabRouting;
tabControl2.SelectedTab = tab2;
}
} }
/// <summary> /// <summary>
@ -78,8 +92,7 @@ namespace v2rayN.Forms
{ {
//路由 //路由
cmbdomainStrategy.Text = config.domainStrategy; cmbdomainStrategy.Text = config.domainStrategy;
int.TryParse(config.routingMode, out int routingMode); cmbroutingMode.SelectedIndex = config.routingMode;
cmbroutingMode.SelectedIndex = routingMode;
txtUseragent.Text = Utils.List2String(config.useragent, true); txtUseragent.Text = Utils.List2String(config.useragent, true);
txtUserdirect.Text = Utils.List2String(config.userdirect, true); txtUserdirect.Text = Utils.List2String(config.userdirect, true);
@ -114,9 +127,7 @@ namespace v2rayN.Forms
chkAllowLANConn.Checked = config.allowLANConn; chkAllowLANConn.Checked = config.allowLANConn;
chkEnableStatistics.Checked = config.enableStatistics; chkEnableStatistics.Checked = config.enableStatistics;
chkKeepOlderDedupl.Checked = config.keepOlderDedupl; chkKeepOlderDedupl.Checked = config.keepOlderDedupl;
chkInterlaceColoring.Checked = config.interlaceColoring;
ComboItem[] cbSource = new ComboItem[] ComboItem[] cbSource = new ComboItem[]
{ {
@ -176,7 +187,7 @@ namespace v2rayN.Forms
return; return;
} }
if (ConfigHandler.SaveConfig(ref config) == 0) if (ConfigHandler.SaveConfigToFile(ref config) == 0)
{ {
this.DialogResult = DialogResult.OK; this.DialogResult = DialogResult.OK;
} }
@ -276,7 +287,7 @@ namespace v2rayN.Forms
{ {
//路由 //路由
string domainStrategy = cmbdomainStrategy.Text; string domainStrategy = cmbdomainStrategy.Text;
string routingMode = cmbroutingMode.SelectedIndex.ToString(); int routingMode = cmbroutingMode.SelectedIndex;
string useragent = txtUseragent.Text.TrimEx(); string useragent = txtUseragent.Text.TrimEx();
string userdirect = txtUserdirect.Text.TrimEx(); string userdirect = txtUserdirect.Text.TrimEx();
@ -345,6 +356,7 @@ namespace v2rayN.Forms
config.enableStatistics = chkEnableStatistics.Checked; config.enableStatistics = chkEnableStatistics.Checked;
config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; config.statisticsFreshRate = (int)cbFreshrate.SelectedValue;
config.keepOlderDedupl = chkKeepOlderDedupl.Checked; config.keepOlderDedupl = chkKeepOlderDedupl.Checked;
config.interlaceColoring = chkInterlaceColoring.Checked;
//if(lastEnableStatistics != config.enableStatistics) //if(lastEnableStatistics != config.enableStatistics)
//{ //{
@ -361,7 +373,7 @@ namespace v2rayN.Forms
private int SaveUserPAC() private int SaveUserPAC()
{ {
string userPacRule = txtuserPacRule.Text.TrimEx(); string userPacRule = txtuserPacRule.Text.TrimEx();
userPacRule = userPacRule.Replace("\"", ""); userPacRule = userPacRule.Replace("\"", "").Replace("'", "");
config.userPacRule = Utils.String2List(userPacRule); config.userPacRule = Utils.String2List(userPacRule);
@ -446,13 +458,7 @@ namespace v2rayN.Forms
class ComboItem class ComboItem
{ {
public int ID public int ID { get; set; }
{ public string Text { get; set; }
get; set;
}
public string Text
{
get; set;
}
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -164,6 +164,9 @@
<data name="chkEnableStatistics.Text" xml:space="preserve"> <data name="chkEnableStatistics.Text" xml:space="preserve">
<value>启用统计(实时网速显示和使用流量显示需要重启v2rayN客户端)</value> <value>启用统计(实时网速显示和使用流量显示需要重启v2rayN客户端)</value>
</data> </data>
<data name="chkInterlaceColoring.Text" xml:space="preserve">
<value>隔行着色</value>
</data>
<data name="chkKeepOlderDedupl.Text" xml:space="preserve"> <data name="chkKeepOlderDedupl.Text" xml:space="preserve">
<value>去重时保留序号较小的项</value> <value>去重时保留序号较小的项</value>
</data> </data>
@ -249,7 +252,7 @@
<value>227, 12</value> <value>227, 12</value>
</data> </data>
<data name="label13.Text" xml:space="preserve"> <data name="label13.Text" xml:space="preserve">
<value>自定义GFWList地址(不需自定义请填空白)</value> <value>自定义GFWList地址(留空则使用默认值)</value>
</data> </data>
<data name="label14.Size" type="System.Drawing.Size, System.Drawing"> <data name="label14.Size" type="System.Drawing.Size, System.Drawing">
<value>191, 12</value> <value>191, 12</value>
@ -279,7 +282,7 @@
<value>协议</value> <value>协议</value>
</data> </data>
<data name="label4.Text" xml:space="preserve"> <data name="label4.Text" xml:space="preserve">
<value>*设置用户PAC规则用逗号(,)隔开</value> <value>*用户PAC内的自定条目。用逗号(,)或换行隔开的匹配模式pattern。英文单引号、双引号将被忽略。</value>
</data> </data>
<data name="label5.Size" type="System.Drawing.Size, System.Drawing"> <data name="label5.Size" type="System.Drawing.Size, System.Drawing">
<value>53, 12</value> <value>53, 12</value>
@ -312,17 +315,20 @@
<data name="panel3.Size" type="System.Drawing.Size, System.Drawing"> <data name="panel3.Size" type="System.Drawing.Size, System.Drawing">
<value>642, 72</value> <value>642, 72</value>
</data> </data>
<data name="tabBasic.Text" xml:space="preserve">
<value> Core:基础设置 </value>
</data>
<data name="tabControl2.Location" type="System.Drawing.Point, System.Drawing"> <data name="tabControl2.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 89</value> <value>3, 89</value>
</data> </data>
<data name="tabControl2.Size" type="System.Drawing.Size, System.Drawing"> <data name="tabControl2.Size" type="System.Drawing.Size, System.Drawing">
<value>642, 481</value> <value>642, 481</value>
</data> </data>
<data name="tabPage1.Text" xml:space="preserve"> <data name="tabGUI.Text" xml:space="preserve">
<value> Core:基础设置 </value> <value> v2rayN设置 </value>
</data> </data>
<data name="tabPage2.Text" xml:space="preserve"> <data name="tabKCP.Text" xml:space="preserve">
<value> Core:路由设置 </value> <value> Core:KCP设置 </value>
</data> </data>
<data name="tabPage3.Size" type="System.Drawing.Size, System.Drawing"> <data name="tabPage3.Size" type="System.Drawing.Size, System.Drawing">
<value>634, 455</value> <value>634, 455</value>
@ -342,19 +348,16 @@
<data name="tabPage5.Text" xml:space="preserve"> <data name="tabPage5.Text" xml:space="preserve">
<value> 3.阻止的Domain或IP </value> <value> 3.阻止的Domain或IP </value>
</data> </data>
<data name="tabPage6.Text" xml:space="preserve">
<value> Core:KCP设置 </value>
</data>
<data name="tabPage7.Text" xml:space="preserve">
<value> v2rayN设置 </value>
</data>
<data name="tabPage8.Size" type="System.Drawing.Size, System.Drawing"> <data name="tabPage8.Size" type="System.Drawing.Size, System.Drawing">
<value>634, 455</value> <value>634, 455</value>
</data> </data>
<data name="tabPage8.Text" xml:space="preserve"> <data name="tabPreDefinedRules.Text" xml:space="preserve">
<value> 4.预定义规则 </value> <value> 4.预定义规则 </value>
</data> </data>
<data name="tabPage9.Text" xml:space="preserve"> <data name="tabRouting.Text" xml:space="preserve">
<value> Core:路由设置 </value>
</data>
<data name="tabUserPAC.Text" xml:space="preserve">
<value> 用户PAC设置 </value> <value> 用户PAC设置 </value>
</data> </data>
<data name="txtUseragent.Size" type="System.Drawing.Size, System.Drawing"> <data name="txtUseragent.Size" type="System.Drawing.Size, System.Drawing">

View file

@ -118,34 +118,22 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="txtUrl.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="txtUrl.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 371</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="txtUrl.Multiline" type="System.Boolean, mscorlib"> <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value> <value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 12</value>
</data> </data>
<data name="txtUrl.Size" type="System.Drawing.Size, System.Drawing"> <data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>356, 70</value> <value>QRCodeControl</value>
</data> </data>
<data name="txtUrl.TabIndex" type="System.Int32, mscorlib"> <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>0</value> <value>356, 441</value>
</data> </data>
<data name="&gt;&gt;txtUrl.Name" xml:space="preserve"> <data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>txtUrl</value> <value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;txtUrl.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;txtUrl.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;txtUrl.ZOrder" xml:space="preserve">
<value>1</value>
</data> </data>
<data name="picQRCode.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="picQRCode.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
@ -153,6 +141,12 @@
<data name="picQRCode.Location" type="System.Drawing.Point, System.Drawing"> <data name="picQRCode.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value> <value>0, 0</value>
</data> </data>
<data name="&gt;&gt;picQRCode.Name" xml:space="preserve">
<value>picQRCode</value>
</data>
<data name="&gt;&gt;picQRCode.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="picQRCode.Size" type="System.Drawing.Size, System.Drawing"> <data name="picQRCode.Size" type="System.Drawing.Size, System.Drawing">
<value>356, 371</value> <value>356, 371</value>
</data> </data>
@ -162,31 +156,37 @@
<data name="picQRCode.TabIndex" type="System.Int32, mscorlib"> <data name="picQRCode.TabIndex" type="System.Int32, mscorlib">
<value>24</value> <value>24</value>
</data> </data>
<data name="&gt;&gt;picQRCode.Name" xml:space="preserve">
<value>picQRCode</value>
</data>
<data name="&gt;&gt;picQRCode.Type" xml:space="preserve"> <data name="&gt;&gt;picQRCode.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="&gt;&gt;picQRCode.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;picQRCode.ZOrder" xml:space="preserve"> <data name="&gt;&gt;picQRCode.ZOrder" xml:space="preserve">
<value>0</value> <value>0</value>
</data> </data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <data name="txtUrl.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<data name="txtUrl.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 371</value>
</data>
<data name="txtUrl.Multiline" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 12</value>
</data> </data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing"> <data name="&gt;&gt;txtUrl.Name" xml:space="preserve">
<value>356, 441</value> <value>txtUrl</value>
</data> </data>
<data name="&gt;&gt;$this.Name" xml:space="preserve"> <data name="&gt;&gt;txtUrl.Parent" xml:space="preserve">
<value>QRCodeControl</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;$this.Type" xml:space="preserve"> <data name="txtUrl.Size" type="System.Drawing.Size, System.Drawing">
<value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>356, 70</value>
</data>
<data name="txtUrl.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;txtUrl.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;txtUrl.ZOrder" xml:space="preserve">
<value>1</value>
</data> </data>
</root> </root>

View file

@ -8,8 +8,6 @@ namespace v2rayN.Forms
{ {
public partial class SubSettingForm : BaseForm public partial class SubSettingForm : BaseForm
{ {
List<SubSettingControl> lstControls = new List<SubSettingControl>();
public SubSettingForm() public SubSettingForm()
{ {
InitializeComponent(); InitializeComponent();
@ -30,8 +28,8 @@ namespace v2rayN.Forms
/// </summary> /// </summary>
private void RefreshSubsView() private void RefreshSubsView()
{ {
panCon.SuspendLayout();
panCon.Controls.Clear(); panCon.Controls.Clear();
lstControls.Clear();
for (int k = config.subItem.Count - 1; k >= 0; k--) for (int k = config.subItem.Count - 1; k >= 0; k--)
{ {
@ -56,9 +54,8 @@ namespace v2rayN.Forms
panCon.Controls.Add(control); panCon.Controls.Add(control);
panCon.Controls.SetChildIndex(control, 0); panCon.Controls.SetChildIndex(control, 0);
lstControls.Add(control);
} }
panCon.ResumeLayout();
} }
private void Control_OnButtonClicked(object sender, EventArgs e) private void Control_OnButtonClicked(object sender, EventArgs e)

View file

@ -156,6 +156,15 @@ namespace v2rayN
/// </summary> /// </summary>
public const string CustomIconName = "v2rayN.ico"; public const string CustomIconName = "v2rayN.ico";
/// <summary>
/// 表格列的排序方式
/// </summary>
public enum sortMode
{
Numeric,
// More, like natural numbers, string length, visual length, etc.
}
public enum StatisticsFreshRate public enum StatisticsFreshRate
{ {
quick = 1000, quick = 1000,
@ -171,61 +180,37 @@ namespace v2rayN
#region #region
/// <summary> /// <summary>
/// 是否需要重启服务V2ray /// 是否需要重启服务V2ray。如果为假LoadV2ray()不做任何事。
/// </summary> /// </summary>
public static bool reloadV2ray public static bool reloadV2ray { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 是否开启全局代理(http) /// 是否开启全局代理(http)
/// </summary> /// </summary>
public static bool sysAgent public static bool sysAgent { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// socks端口 /// socks端口
/// </summary> /// </summary>
public static int socksPort public static int socksPort { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// http端口 /// http端口
/// </summary> /// </summary>
public static int httpPort public static int httpPort { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// PAC端口 /// PAC端口
/// </summary> /// </summary>
public static int pacPort public static int pacPort { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public static int statePort public static int statePort { get; set; }
{
get; set;
}
public static Job processJob public static Job processJob { get; set; }
{ public static System.Threading.Mutex mutexObj { get; set; }
get; set;
}
public static System.Threading.Mutex mutexObj
{
get; set;
}
#endregion #endregion

View file

@ -85,10 +85,6 @@ namespace v2rayN.Handler
{ {
config.domainStrategy = "IPIfNonMatch"; config.domainStrategy = "IPIfNonMatch";
} }
if (Utils.IsNullOrEmpty(config.routingMode))
{
config.routingMode = "0";
}
if (config.useragent == null) if (config.useragent == null)
{ {
config.useragent = new List<string>(); config.useragent = new List<string>();
@ -137,10 +133,6 @@ namespace v2rayN.Handler
{ {
config.speedPingTestUrl = Global.SpeedPingTestUrl; config.speedPingTestUrl = Global.SpeedPingTestUrl;
} }
if (Utils.IsNullOrEmpty(config.urlGFWList))
{
config.urlGFWList = Global.GFWLIST_URL;
}
//if (Utils.IsNullOrEmpty(config.remoteDNS)) //if (Utils.IsNullOrEmpty(config.remoteDNS))
//{ //{
// config.remoteDNS = "1.1.1.1"; // config.remoteDNS = "1.1.1.1";
@ -227,7 +219,7 @@ namespace v2rayN.Handler
} }
} }
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -268,7 +260,7 @@ namespace v2rayN.Handler
Global.reloadV2ray = true; Global.reloadV2ray = true;
} }
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -306,7 +298,7 @@ namespace v2rayN.Handler
config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 config.vmess.Insert(index + 1, vmessItem); // 插入到下一项
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -332,32 +324,22 @@ namespace v2rayN.Handler
config.index = index; config.index = index;
Global.reloadV2ray = true; Global.reloadV2ray = true;
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
/// <summary> /// <summary>
/// 保参数 /// 保存设置文件
/// </summary> /// </summary>
/// <param name="config"></param> /// <param name="config"></param>
/// <returns></returns> public static int SaveConfigToFile(ref Config config)
public static int SaveConfig(ref Config config, bool reload = true)
{ {
Global.reloadV2ray = reload; return Utils.ToJsonFile(config, Utils.GetPath(configRes));
ToJsonFile(config);
return 0;
} }
public static int SaveConfigToFile(Config config)
/// <summary>
/// 存储文件
/// </summary>
/// <param name="config"></param>
private static void ToJsonFile(Config config)
{ {
Utils.ToJsonFile(config, Utils.GetPath(configRes)); return Utils.ToJsonFile(config, Utils.GetPath(configRes));
} }
/// <summary> /// <summary>
@ -541,7 +523,7 @@ namespace v2rayN.Handler
} }
Global.reloadV2ray = true; Global.reloadV2ray = true;
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -580,7 +562,7 @@ namespace v2rayN.Handler
Global.reloadV2ray = true; Global.reloadV2ray = true;
} }
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -601,7 +583,7 @@ namespace v2rayN.Handler
Global.reloadV2ray = true; Global.reloadV2ray = true;
} }
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -642,7 +624,7 @@ namespace v2rayN.Handler
} }
} }
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -681,7 +663,7 @@ namespace v2rayN.Handler
} }
} }
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -862,7 +844,7 @@ namespace v2rayN.Handler
} }
} }
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }
@ -886,7 +868,7 @@ namespace v2rayN.Handler
} }
} }
ToJsonFile(config); SaveConfigToFile(config);
return 0; return 0;
} }

View file

@ -97,11 +97,11 @@ namespace v2rayN.Handler
configCopy.index = index; configCopy.index = index;
if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out string msg) != 0) if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out string msg) != 0)
{ {
UI.Show(msg); UI.ShowWarning(msg);
} }
else else
{ {
UI.ShowWarning(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); UI.Show(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName));
} }
} }
@ -137,11 +137,11 @@ namespace v2rayN.Handler
configCopy.index = index; configCopy.index = index;
if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out string msg) != 0) if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out string msg) != 0)
{ {
UI.Show(msg); UI.ShowWarning(msg);
} }
else else
{ {
UI.ShowWarning(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); UI.Show(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName));
} }
} }

View file

@ -150,24 +150,19 @@ namespace v2rayN.Handler
try try
{ {
int httpPort = _config.GetLocalPort(Global.InboundHttp); int httpPort = _config.GetLocalPort(Global.InboundHttp);
try
Task<int> t = Task.Run(() =>
{ {
try WebProxy webProxy = new WebProxy(Global.Loopback, httpPort);
{ int responseTime = -1;
WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); string status = GetRealPingTime(Global.AvailabilityTestUrl, webProxy, out responseTime);
int responseTime = -1; bool noError = Utils.IsNullOrEmpty(status);
string status = GetRealPingTime(Global.AvailabilityTestUrl, webProxy, out responseTime); return noError ? responseTime : -1;
bool noError = Utils.IsNullOrEmpty(status); }
return noError ? responseTime : -1; catch (Exception ex)
} {
catch (Exception ex) Utils.SaveLog(ex.Message, ex);
{ return -1;
Utils.SaveLog(ex.Message, ex); }
return -1;
}
});
return t.Result;
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -20,15 +20,9 @@ namespace v2rayN.Handler
Action<ulong, ulong, List<ServerStatItem>> updateFunc_; Action<ulong, ulong, List<ServerStatItem>> updateFunc_;
public bool Enable public bool Enable { get; set; }
{
get; set;
}
public bool UpdateUI public bool UpdateUI { get; set; }
{
get; set;
}
public List<ServerStatItem> Statistic public List<ServerStatItem> Statistic
{ {

View file

@ -195,15 +195,15 @@ namespace v2rayN.Handler
switch (config.routingMode) switch (config.routingMode)
{ {
case "0": case 0:
break; break;
case "1": case 1:
routingGeo("ip", "private", Global.directTag, ref v2rayConfig); routingGeo("ip", "private", Global.directTag, ref v2rayConfig);
break; break;
case "2": case 2:
routingGeo("", "cn", Global.directTag, ref v2rayConfig); routingGeo("", "cn", Global.directTag, ref v2rayConfig);
break; break;
case "3": case 3:
routingGeo("ip", "private", Global.directTag, ref v2rayConfig); routingGeo("ip", "private", Global.directTag, ref v2rayConfig);
routingGeo("", "cn", Global.directTag, ref v2rayConfig); routingGeo("", "cn", Global.directTag, ref v2rayConfig);
break; break;

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Text; using System.Text;
using System.Threading.Tasks;
using v2rayN.Mode; using v2rayN.Mode;
namespace v2rayN.Handler namespace v2rayN.Handler
@ -38,21 +39,18 @@ namespace v2rayN.Handler
/// <summary> /// <summary>
/// 载入V2ray /// 载入V2ray
/// </summary> /// </summary>
public void LoadV2ray(Config config) public Task LoadV2ray(Config config)
{ {
if (Global.reloadV2ray) return Task.Run(() =>
{ {
if (!Global.reloadV2ray) return;
string fileName = Utils.GetPath(v2rayConfigRes); string fileName = Utils.GetPath(v2rayConfigRes);
if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) != 0) bool bOk = V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) == 0;
{ ShowMsg(bOk, msg);
ShowMsg(false, msg); if (bOk)
}
else
{
ShowMsg(true, msg);
V2rayRestart(); V2rayRestart();
} });
}
} }
/// <summary> /// <summary>
@ -305,6 +303,7 @@ namespace v2rayN.Handler
{ {
try try
{ {
if (p.HasExited) return;
p.CloseMainWindow(); p.CloseMainWindow();
p.WaitForExit(100); p.WaitForExit(100);
if (!p.HasExited) if (!p.HasExited)

View file

@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using v2rayN.Mode; using v2rayN.Mode;
namespace v2rayN.HttpProxyHandler namespace v2rayN.HttpProxyHandler
@ -148,33 +149,36 @@ namespace v2rayN.HttpProxyHandler
/// </summary> /// </summary>
/// <param name="config"></param> /// <param name="config"></param>
/// <param name="forced"></param> /// <param name="forced"></param>
public static void RestartHttpAgent(Config config, bool forced) public static Task RestartHttpAgent(Config config, bool forced)
{ {
bool isRestart = false; return Task.Run(() =>
if (config.listenerType == ListenerType.noHttpProxy) {
{ bool isRestart = false;
// 关闭http proxy时直接返回 if (config.listenerType == ListenerType.noHttpProxy)
return; {
} // 关闭http proxy时直接返回
//强制重启或者socks端口变化 return;
if (forced) }
{ //强制重启或者socks端口变化
isRestart = true; if (forced)
}
else
{
int localPort = config.GetLocalPort(Global.InboundSocks);
if (localPort != Global.socksPort)
{ {
isRestart = true; isRestart = true;
} }
} else
if (isRestart) {
{ int localPort = config.GetLocalPort(Global.InboundSocks);
CloseHttpAgent(config); if (localPort != Global.socksPort)
StartHttpAgent(config); {
} isRestart = true;
Update(config, false); }
}
if (isRestart)
{
CloseHttpAgent(config);
StartHttpAgent(config);
}
Update(config, false);
});
} }
public static string GetPacUrl() public static string GetPacUrl()

View file

@ -55,10 +55,7 @@ namespace v2rayN.HttpProxyHandler
} }
} }
public int RunningPort public int RunningPort { get; set; }
{
get; set;
}
public void Restart(int localPort, Config config) public void Restart(int localPort, Config config)
{ {
@ -141,6 +138,7 @@ namespace v2rayN.HttpProxyHandler
{ {
try try
{ {
if (p.HasExited) return; // someting, while the GUI app is exiting.
p.CloseMainWindow(); p.CloseMainWindow();
p.WaitForExit(100); p.WaitForExit(100);
if (!p.HasExited) if (!p.HasExited)

View file

@ -15,197 +15,127 @@ namespace v2rayN.Mode
/// <summary> /// <summary>
/// 本地监听 /// 本地监听
/// </summary> /// </summary>
public List<InItem> inbound public List<InItem> inbound { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 允许日志 /// 允许日志
/// </summary> /// </summary>
public bool logEnabled public bool logEnabled { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 日志等级 /// 日志等级
/// </summary> /// </summary>
public string loglevel public string loglevel { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 活动配置序号 /// 活动配置序号
/// </summary> /// </summary>
public int index public int index { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// vmess服务器信息 /// vmess服务器信息
/// </summary> /// </summary>
public List<VmessItem> vmess public List<VmessItem> vmess { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 允许Mux多路复用 /// 允许Mux多路复用
/// </summary> /// </summary>
public bool muxEnabled public bool muxEnabled { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 域名解析策略 /// 域名解析策略
/// </summary> /// </summary>
public string domainStrategy public string domainStrategy { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 路由模式 /// 路由模式
/// </summary> /// </summary>
public string routingMode public int routingMode { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 用户自定义需代理的网址或ip /// 用户自定义需代理的网址或ip
/// </summary> /// </summary>
public List<string> useragent public List<string> useragent { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 用户自定义直连的网址或ip /// 用户自定义直连的网址或ip
/// </summary> /// </summary>
public List<string> userdirect public List<string> userdirect { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 用户自定义阻止的网址或ip /// 用户自定义阻止的网址或ip
/// </summary> /// </summary>
public List<string> userblock public List<string> userblock { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// KcpItem /// KcpItem
/// </summary> /// </summary>
public KcpItem kcpItem public KcpItem kcpItem { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 监听状态 /// 监听状态
/// </summary> /// </summary>
public ListenerType listenerType public ListenerType listenerType { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 自定义服务器下载测速url /// 自定义服务器下载测速url
/// </summary> /// </summary>
public string speedTestUrl public string speedTestUrl { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 自定义“服务器真连接延迟”测试url /// 自定义“服务器真连接延迟”测试url
/// </summary> /// </summary>
public string speedPingTestUrl public string speedPingTestUrl { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 自定义GFWList url /// 自定义GFWList url。空白则使用 Global.GFWLIST_URL
/// </summary> /// </summary>
public string urlGFWList public string urlGFWList { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 允许来自局域网的连接 /// 允许来自局域网的连接
/// </summary> /// </summary>
public bool allowLANConn public bool allowLANConn { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 启用实时网速和流量统计 /// 启用实时网速和流量统计
/// </summary> /// </summary>
public bool enableStatistics public bool enableStatistics { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 去重时优先保留较旧(顶部)节点 /// 去重时优先保留较旧(顶部)节点
/// </summary> /// </summary>
public bool keepOlderDedupl public bool keepOlderDedupl { get; set; }
{
get; set; /// <summary>
} /// 服务器列表隔行着色
/// </summary>
public bool interlaceColoring { get; set; }
/// <summary> /// <summary>
/// 视图刷新率 /// 视图刷新率
/// </summary> /// </summary>
public int statisticsFreshRate public int statisticsFreshRate { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 自定义远程DNS /// 自定义远程DNS
/// </summary> /// </summary>
public string remoteDNS public string remoteDNS { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 是否允许不安全连接 /// 是否允许不安全连接
/// </summary> /// </summary>
public string defaultAllowInsecure public string defaultAllowInsecure { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 订阅 /// 订阅
/// </summary> /// </summary>
public List<SubItem> subItem public List<SubItem> subItem { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// UI /// UI
/// </summary> /// </summary>
public UIItem uiItem public UIItem uiItem { get; set; }
{
get; set;
}
public List<string> userPacRule public List<string> userPacRule { get; set; }
{
get; set;
}
#region #region
@ -459,125 +389,77 @@ namespace v2rayN.Mode
/// <summary> /// <summary>
/// 版本(现在=2) /// 版本(现在=2)
/// </summary> /// </summary>
public int configVersion public int configVersion { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 远程服务器地址 /// 远程服务器地址
/// </summary> /// </summary>
public string address public string address { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 远程服务器端口 /// 远程服务器端口
/// </summary> /// </summary>
public int port public int port { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 远程服务器ID /// 远程服务器ID
/// </summary> /// </summary>
public string id public string id { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 远程服务器额外ID /// 远程服务器额外ID
/// </summary> /// </summary>
public int alterId public int alterId { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 本地安全策略 /// 本地安全策略
/// </summary> /// </summary>
public string security public string security { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// tcp,kcp,ws,h2,quic /// tcp,kcp,ws,h2,quic
/// </summary> /// </summary>
public string network public string network { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 备注或别名 /// 备注或别名
/// </summary> /// </summary>
public string remarks public string remarks { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 伪装类型 /// 伪装类型
/// </summary> /// </summary>
public string headerType public string headerType { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 伪装的域名 /// 伪装的域名
/// </summary> /// </summary>
public string requestHost public string requestHost { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ws h2 path /// ws h2 path
/// </summary> /// </summary>
public string path public string path { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 底层传输安全 /// 底层传输安全
/// </summary> /// </summary>
public string streamSecurity public string streamSecurity { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 是否允许不安全连接(用于客户端) /// 是否允许不安全连接(用于客户端)
/// </summary> /// </summary>
public string allowInsecure public string allowInsecure { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// config type(1=normal,2=custom) /// config type(1=normal,2=custom)
/// </summary> /// </summary>
public int configType public int configType { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public string testResult public string testResult { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// SubItem id /// SubItem id
/// </summary> /// </summary>
public string subid public string subid { get; set; }
{
get; set;
}
} }
[Serializable] [Serializable]
@ -586,26 +468,17 @@ namespace v2rayN.Mode
/// <summary> /// <summary>
/// 本地监听端口 /// 本地监听端口
/// </summary> /// </summary>
public int localPort public int localPort { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 协议默认为socks /// 协议默认为socks
/// </summary> /// </summary>
public string protocol public string protocol { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 允许udp /// 允许udp
/// </summary> /// </summary>
public bool udpEnabled public bool udpEnabled { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 开启流量探测 /// 开启流量探测
@ -619,52 +492,31 @@ namespace v2rayN.Mode
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public int mtu public int mtu { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public int tti public int tti { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public int uplinkCapacity public int uplinkCapacity { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public int downlinkCapacity public int downlinkCapacity { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public bool congestion public bool congestion { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public int readBufferSize public int readBufferSize { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public int writeBufferSize public int writeBufferSize { get; set; }
{
get; set;
}
} }
@ -674,27 +526,15 @@ namespace v2rayN.Mode
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public string id public string id { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// 备注 /// 备注
/// </summary> /// </summary>
public string remarks public string remarks { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// url /// url
/// </summary> /// </summary>
public string url public string url { get; set; }
{
get; set;
}
/// <summary> /// <summary>
/// enable /// enable
/// </summary> /// </summary>
@ -704,16 +544,8 @@ namespace v2rayN.Mode
[Serializable] [Serializable]
public class UIItem public class UIItem
{ {
public System.Drawing.Size mainSize { get; set; }
public Dictionary<string, int> mainLvColWidth { get; set; }
public System.Drawing.Size mainSize public List<string> mainLvColLayout { get; set; }
{
get; set;
}
public Dictionary<string, int> mainLvColWidth
{
get; set;
}
} }
} }

View file

@ -6,38 +6,17 @@ namespace v2rayN.Mode
[Serializable] [Serializable]
public class ServerStatistics public class ServerStatistics
{ {
public List<ServerStatItem> server public List<ServerStatItem> server { get; set; }
{
get; set;
}
} }
[Serializable] [Serializable]
public class ServerStatItem public class ServerStatItem
{ {
public string itemId public string itemId { get; set; }
{ public ulong totalUp { get; set; }
get; set; public ulong totalDown { get; set; }
} public ulong todayUp { get; set; }
public ulong totalUp public ulong todayDown { get; set; }
{ public long dateNow { get; set; }
get; set;
}
public ulong totalDown
{
get; set;
}
public ulong todayUp
{
get; set;
}
public ulong todayDown
{
get; set;
}
public long dateNow
{
get; set;
}
} }
} }

View file

@ -8,46 +8,46 @@ namespace v2rayN.Mode
/// <summary> /// <summary>
/// 版本 /// 版本
/// </summary> /// </summary>
public string v { get; set; } = string.Empty; public string v { get; set; }
/// <summary> /// <summary>
/// 备注 /// 备注
/// </summary> /// </summary>
public string ps { get; set; } = string.Empty; public string ps { get; set; }
/// <summary> /// <summary>
/// 远程服务器地址 /// 远程服务器地址
/// </summary> /// </summary>
public string add { get; set; } = string.Empty; public string add { get; set; }
/// <summary> /// <summary>
/// 远程服务器端口 /// 远程服务器端口
/// </summary> /// </summary>
public string port { get; set; } = string.Empty; public string port { get; set; }
/// <summary> /// <summary>
/// 远程服务器ID /// 远程服务器ID
/// </summary> /// </summary>
public string id { get; set; } = string.Empty; public string id { get; set; }
/// <summary> /// <summary>
/// 远程服务器额外ID /// 远程服务器额外ID
/// </summary> /// </summary>
public string aid { get; set; } = string.Empty; public string aid { get; set; }
/// <summary> /// <summary>
/// 传输协议tcp,kcp,ws /// 传输协议tcp,kcp,ws
/// </summary> /// </summary>
public string net { get; set; } = string.Empty; public string net { get; set; }
/// <summary> /// <summary>
/// 伪装类型 /// 伪装类型
/// </summary> /// </summary>
public string type { get; set; } = string.Empty; public string type { get; set; }
/// <summary> /// <summary>
/// 伪装的域名 /// 伪装的域名
/// </summary> /// </summary>
public string host { get; set; } = string.Empty; public string host { get; set; }
/// <summary> /// <summary>
/// path /// path
/// </summary> /// </summary>
public string path { get; set; } = string.Empty; public string path { get; set; }
/// <summary> /// <summary>
/// 底层传输安全 /// 底层传输安全
/// </summary> /// </summary>
public string tls { get; set; } = string.Empty; public string tls { get; set; }
} }
} }

View file

@ -19,7 +19,7 @@ namespace v2rayN.Properties {
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。 // (以 /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.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources { internal class Resources {

View file

@ -118,55 +118,55 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="privoxy_exe" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="about" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="about" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\about.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\about.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="option" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\option.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="restart" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="sysproxy_exe" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\sysproxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="sub" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\sub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="server" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="notify" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\notify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="checkupdate" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="promotion" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="sysproxy64_exe" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="privoxy_conf" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value>
</data>
<data name="minimize" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pac_txt" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="help" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="abp_js" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="abp_js" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="checkupdate" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="help" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="minimize" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="notify" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\notify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="option" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\option.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pac_txt" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="privoxy_conf" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value>
</data>
<data name="privoxy_exe" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="promotion" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="restart" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="server" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="share" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="share" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="sub" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\sub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="sysproxy_exe" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\sysproxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="sysproxy64_exe" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root> </root>

View file

@ -484,7 +484,7 @@ namespace v2rayN.Resx {
} }
/// <summary> /// <summary>
/// 查找类似 Simplify PAC Success 的本地化字符串。 /// 查找类似 Write PAC success 的本地化字符串。
/// </summary> /// </summary>
internal static string MsgSimplifyPAC { internal static string MsgSimplifyPAC {
get { get {
@ -690,6 +690,42 @@ namespace v2rayN.Resx {
} }
} }
/// <summary>
/// 查找类似 Bypass CN 的本地化字符串。
/// </summary>
internal static string RoutingModeBypassCN {
get {
return ResourceManager.GetString("RoutingModeBypassCN", resourceCulture);
}
}
/// <summary>
/// 查找类似 Bypass LAN 的本地化字符串。
/// </summary>
internal static string RoutingModeBypassLAN {
get {
return ResourceManager.GetString("RoutingModeBypassLAN", resourceCulture);
}
}
/// <summary>
/// 查找类似 Bypass LAN+CN 的本地化字符串。
/// </summary>
internal static string RoutingModeBypassLANCN {
get {
return ResourceManager.GetString("RoutingModeBypassLANCN", resourceCulture);
}
}
/// <summary>
/// 查找类似 Global 的本地化字符串。
/// </summary>
internal static string RoutingModeGlobal {
get {
return ResourceManager.GetString("RoutingModeGlobal", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。
/// </summary> /// </summary>
@ -708,6 +744,15 @@ namespace v2rayN.Resx {
} }
} }
/// <summary>
/// 查找类似 ... 的本地化字符串。
/// </summary>
internal static string ServerLatencyChecking {
get {
return ResourceManager.GetString("ServerLatencyChecking", resourceCulture);
}
}
/// <summary> /// <summary>
/// 查找类似 SlowFresh 的本地化字符串。 /// 查找类似 SlowFresh 的本地化字符串。
/// </summary> /// </summary>
@ -789,5 +834,14 @@ namespace v2rayN.Resx {
return ResourceManager.GetString("TestMeOutput", resourceCulture); return ResourceManager.GetString("TestMeOutput", resourceCulture);
} }
} }
/// <summary>
/// 查找类似 Latency: {0} 的本地化字符串。
/// </summary>
internal static string toolSslServerLatency {
get {
return ResourceManager.GetString("toolSslServerLatency", resourceCulture);
}
}
} }
} }

View file

@ -259,7 +259,7 @@
<value>Resolve {0} successfully</value> <value>Resolve {0} successfully</value>
</data> </data>
<data name="MsgSimplifyPAC" xml:space="preserve"> <data name="MsgSimplifyPAC" xml:space="preserve">
<value>Simplify PAC Success</value> <value>Write PAC success</value>
</data> </data>
<data name="MsgStartGettingSubscriptions" xml:space="preserve"> <data name="MsgStartGettingSubscriptions" xml:space="preserve">
<value>Start getting subscriptions</value> <value>Start getting subscriptions</value>
@ -327,12 +327,27 @@
<data name="RemoveServer" xml:space="preserve"> <data name="RemoveServer" xml:space="preserve">
<value>Are you sure to remove the server?</value> <value>Are you sure to remove the server?</value>
</data> </data>
<data name="RoutingModeBypassCN" xml:space="preserve">
<value>Bypass CN</value>
</data>
<data name="RoutingModeBypassLAN" xml:space="preserve">
<value>Bypass LAN</value>
</data>
<data name="RoutingModeBypassLANCN" xml:space="preserve">
<value>Bypass LAN+CN</value>
</data>
<data name="RoutingModeGlobal" xml:space="preserve">
<value>Global</value>
</data>
<data name="SaveClientConfigurationIn" xml:space="preserve"> <data name="SaveClientConfigurationIn" xml:space="preserve">
<value>The client configuration file is saved at: {0}</value> <value>The client configuration file is saved at: {0}</value>
</data> </data>
<data name="SaveServerConfigurationIn" xml:space="preserve"> <data name="SaveServerConfigurationIn" xml:space="preserve">
<value>The server configuration file is saved at: {0}</value> <value>The server configuration file is saved at: {0}</value>
</data> </data>
<data name="ServerLatencyChecking" xml:space="preserve">
<value>...</value>
</data>
<data name="SlowFresh" xml:space="preserve"> <data name="SlowFresh" xml:space="preserve">
<value>SlowFresh</value> <value>SlowFresh</value>
</data> </data>
@ -361,4 +376,7 @@
<data name="TestMeOutput" xml:space="preserve"> <data name="TestMeOutput" xml:space="preserve">
<value>The ping of current service: {0}</value> <value>The ping of current service: {0}</value>
</data> </data>
<data name="toolSslServerLatency" xml:space="preserve">
<value>Latency: {0}</value>
</data>
</root> </root>

View file

@ -259,7 +259,7 @@
<value>解析{0}成功</value> <value>解析{0}成功</value>
</data> </data>
<data name="MsgSimplifyPAC" xml:space="preserve"> <data name="MsgSimplifyPAC" xml:space="preserve">
<value>简化PAC成功</value> <value>成功写入PAC</value>
</data> </data>
<data name="MsgStartGettingSubscriptions" xml:space="preserve"> <data name="MsgStartGettingSubscriptions" xml:space="preserve">
<value>开始获取订阅内容</value> <value>开始获取订阅内容</value>
@ -274,13 +274,13 @@
<value>订阅内容解码失败(非BASE64码)</value> <value>订阅内容解码失败(非BASE64码)</value>
</data> </data>
<data name="MsgUnpacking" xml:space="preserve"> <data name="MsgUnpacking" xml:space="preserve">
<value>正在解压......</value> <value>正在解压...</value>
</data> </data>
<data name="MsgUpdateSubscriptionEnd" xml:space="preserve"> <data name="MsgUpdateSubscriptionEnd" xml:space="preserve">
<value>更新订阅结束</value> <value>订阅内容已更新</value>
</data> </data>
<data name="MsgUpdateSubscriptionStart" xml:space="preserve"> <data name="MsgUpdateSubscriptionStart" xml:space="preserve">
<value>更新订阅开始</value> <value>开始更新订阅</value>
</data> </data>
<data name="MsgUpdateV2rayCoreSuccessfully" xml:space="preserve"> <data name="MsgUpdateV2rayCoreSuccessfully" xml:space="preserve">
<value>更新V2rayCore成功</value> <value>更新V2rayCore成功</value>
@ -327,12 +327,27 @@
<data name="RemoveServer" xml:space="preserve"> <data name="RemoveServer" xml:space="preserve">
<value>是否确定移除服务器?</value> <value>是否确定移除服务器?</value>
</data> </data>
<data name="RoutingModeBypassCN" xml:space="preserve">
<value>绕过大陆</value>
</data>
<data name="RoutingModeBypassLAN" xml:space="preserve">
<value>绕过局域网</value>
</data>
<data name="RoutingModeBypassLANCN" xml:space="preserve">
<value>绕过局域网和大陆</value>
</data>
<data name="RoutingModeGlobal" xml:space="preserve">
<value>路由: 全局</value>
</data>
<data name="SaveClientConfigurationIn" xml:space="preserve"> <data name="SaveClientConfigurationIn" xml:space="preserve">
<value>客户端配置文件保存在:{0}</value> <value>客户端配置文件保存在:{0}</value>
</data> </data>
<data name="SaveServerConfigurationIn" xml:space="preserve"> <data name="SaveServerConfigurationIn" xml:space="preserve">
<value>服务端配置文件保存在:{0}</value> <value>服务端配置文件保存在:{0}</value>
</data> </data>
<data name="ServerLatencyChecking" xml:space="preserve">
<value>...</value>
</data>
<data name="SlowFresh" xml:space="preserve"> <data name="SlowFresh" xml:space="preserve">
<value>慢</value> <value>慢</value>
</data> </data>
@ -361,4 +376,7 @@
<data name="TestMeOutput" xml:space="preserve"> <data name="TestMeOutput" xml:space="preserve">
<value>当前服务的真连接延迟: {0}</value> <value>当前服务的真连接延迟: {0}</value>
</data> </data>
<data name="toolSslServerLatency" xml:space="preserve">
<value>延迟: {0}</value>
</data>
</root> </root>

View file

@ -168,7 +168,7 @@ namespace v2rayN
} }
} }
/// <summary> /// <summary>
/// 逗号分隔的字符串,转List<string> /// 换行或逗号分隔的字符串,转List<string>
/// </summary> /// </summary>
/// <param name="str"></param> /// <param name="str"></param>
/// <returns></returns> /// <returns></returns>
@ -176,7 +176,7 @@ namespace v2rayN
{ {
try try
{ {
str = str.Replace(Environment.NewLine, ""); str = str.Replace("\r", ",").Replace("\n", ","); // 用户复制的可能是\r、\n或\r\n
return new List<string>(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); return new List<string>(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries));
} }
catch catch
@ -318,6 +318,10 @@ namespace v2rayN
return $"{string.Format("{0:f1}", result)} {unit}"; return $"{string.Format("{0:f1}", result)} {unit}";
} }
public static int ServerVmIndexof(List<Mode.VmessItem> source, Mode.VmessItem findIt)
{
return source.IndexOf(findIt);
}
public static void DedupServerList(List<Mode.VmessItem> source, out List<Mode.VmessItem> result, bool keepOlder) public static void DedupServerList(List<Mode.VmessItem> source, out List<Mode.VmessItem> result, bool keepOlder)
{ {
List<Mode.VmessItem> list = new List<Mode.VmessItem>(); List<Mode.VmessItem> list = new List<Mode.VmessItem>();

View file

@ -97,6 +97,7 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Base\ListViewSort.cs" />
<Compile Include="Forms\AddServer4Form.cs"> <Compile Include="Forms\AddServer4Form.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View file

@ -60,7 +60,6 @@
// label1 // label1
// //
this.label1.AutoSize = true; this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("宋体", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label1.Location = new System.Drawing.Point(79, 64); this.label1.Location = new System.Drawing.Point(79, 64);
this.label1.Name = "label1"; this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(205, 15); this.label1.Size = new System.Drawing.Size(205, 15);
@ -70,7 +69,6 @@
// label2 // label2
// //
this.label2.AutoSize = true; this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("宋体", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label2.Location = new System.Drawing.Point(79, 37); this.label2.Location = new System.Drawing.Point(79, 37);
this.label2.Name = "label2"; this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(471, 15); this.label2.Size = new System.Drawing.Size(471, 15);