mirror of
https://github.com/2dust/v2rayN.git
synced 2025-10-13 20:09:12 +00:00
Compare commits
3 commits
5d55a55754
...
dbd4f55981
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dbd4f55981 | ||
![]() |
5f5d7172ee | ||
![]() |
fbd4557b44 |
17 changed files with 98 additions and 29 deletions
|
@ -10,7 +10,7 @@ namespace ServiceLib.Common
|
||||||
{
|
{
|
||||||
private static readonly Lazy<HttpClientHelper> _instance = new(() =>
|
private static readonly Lazy<HttpClientHelper> _instance = new(() =>
|
||||||
{
|
{
|
||||||
HttpClientHandler handler = new() { UseCookies = false };
|
SocketsHttpHandler handler = new() { UseCookies = false };
|
||||||
HttpClientHelper helper = new(new HttpClient(handler));
|
HttpClientHelper helper = new(new HttpClient(handler));
|
||||||
return helper;
|
return helper;
|
||||||
});
|
});
|
||||||
|
|
|
@ -68,7 +68,8 @@
|
||||||
public const string AutoRunRegPath = @"Software\Microsoft\Windows\CurrentVersion\Run";
|
public const string AutoRunRegPath = @"Software\Microsoft\Windows\CurrentVersion\Run";
|
||||||
public const string AutoRunName = "v2rayNAutoRun";
|
public const string AutoRunName = "v2rayNAutoRun";
|
||||||
public const string CustomIconName = "v2rayN.ico";
|
public const string CustomIconName = "v2rayN.ico";
|
||||||
public const string IEProxyExceptions = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*";
|
public const string SystemProxyExceptionsWindows = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*";
|
||||||
|
public const string SystemProxyExceptionsLinux = "localhost, 127.0.0.0/8, ::1";
|
||||||
public const string RoutingRuleComma = "<COMMA>";
|
public const string RoutingRuleComma = "<COMMA>";
|
||||||
public const string GrpcGunMode = "gun";
|
public const string GrpcGunMode = "gun";
|
||||||
public const string GrpcMultiMode = "multi";
|
public const string GrpcMultiMode = "multi";
|
||||||
|
|
|
@ -120,9 +120,14 @@ namespace ServiceLib.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
config.ConstItem ??= new ConstItem();
|
config.ConstItem ??= new ConstItem();
|
||||||
if (Utils.IsNullOrEmpty(config.ConstItem.DefIEProxyExceptions))
|
if (Utils.IsNotEmpty(config.ConstItem.DefIEProxyExceptions))
|
||||||
{
|
{
|
||||||
config.ConstItem.DefIEProxyExceptions = Global.IEProxyExceptions;
|
config.SystemProxyItem.SystemProxyExceptions = $"{config.ConstItem.DefIEProxyExceptions};{config.SystemProxyItem.SystemProxyExceptions}";
|
||||||
|
config.ConstItem.DefIEProxyExceptions = string.Empty;
|
||||||
|
}
|
||||||
|
if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux;
|
||||||
}
|
}
|
||||||
|
|
||||||
config.SpeedTestItem ??= new();
|
config.SpeedTestItem ??= new();
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
{
|
{
|
||||||
public class ProxySettingLinux
|
public class ProxySettingLinux
|
||||||
{
|
{
|
||||||
public static async Task SetProxy(string host, int port)
|
public static async Task SetProxy(string host, int port, string exceptions)
|
||||||
{
|
{
|
||||||
var lstCmd = GetSetCmds(host, port);
|
var lstCmd = GetSetCmds(host, port, exceptions);
|
||||||
|
|
||||||
await ExecCmd(lstCmd);
|
await ExecCmd(lstCmd);
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<CmdItem> GetSetCmds(string host, int port)
|
private static List<CmdItem> GetSetCmds(string host, int port, string exceptions)
|
||||||
{
|
{
|
||||||
var isKde = IsKde(out var configDir);
|
var isKde = IsKde(out var configDir);
|
||||||
List<string> lstType = ["", "http", "https", "socks", "ftp"];
|
List<string> lstType = ["", "http", "https", "socks", "ftp"];
|
||||||
|
@ -41,6 +41,10 @@
|
||||||
{
|
{
|
||||||
lstCmd.AddRange(GetSetCmd4Kde(type, host, port, configDir));
|
lstCmd.AddRange(GetSetCmd4Kde(type, host, port, configDir));
|
||||||
}
|
}
|
||||||
|
if (exceptions.IsNotEmpty())
|
||||||
|
{
|
||||||
|
lstCmd.AddRange(GetSetCmd4Kde("exceptions", exceptions, 0, configDir));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -48,6 +52,10 @@
|
||||||
{
|
{
|
||||||
lstCmd.AddRange(GetSetCmd4Gnome(type, host, port));
|
lstCmd.AddRange(GetSetCmd4Gnome(type, host, port));
|
||||||
}
|
}
|
||||||
|
if (exceptions.IsNotEmpty())
|
||||||
|
{
|
||||||
|
lstCmd.AddRange(GetSetCmd4Gnome("exceptions", exceptions, 0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return lstCmd;
|
return lstCmd;
|
||||||
}
|
}
|
||||||
|
@ -89,6 +97,14 @@
|
||||||
Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "1"]
|
Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "1"]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if (type == "exceptions")
|
||||||
|
{
|
||||||
|
lstCmd.Add(new()
|
||||||
|
{
|
||||||
|
Cmd = "kwriteconfig5",
|
||||||
|
Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "NoProxyFor", host]
|
||||||
|
});
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var type2 = type.Equals("https") ? "http" : type;
|
var type2 = type.Equals("https") ? "http" : type;
|
||||||
|
@ -114,6 +130,14 @@
|
||||||
Arguments = ["set", "org.gnome.system.proxy", "mode", "manual"]
|
Arguments = ["set", "org.gnome.system.proxy", "mode", "manual"]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if (type == "exceptions")
|
||||||
|
{
|
||||||
|
lstCmd.Add(new()
|
||||||
|
{
|
||||||
|
Cmd = "gsettings",
|
||||||
|
Arguments = ["set", $"org.gnome.system.proxy", "ignore-hosts", JsonUtils.Serialize(host.Split(','), false)]
|
||||||
|
});
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lstCmd.Add(new()
|
lstCmd.Add(new()
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks);
|
var port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks);
|
||||||
|
var exceptions = config.SystemProxyItem.SystemProxyExceptions;
|
||||||
if (port <= 0)
|
if (port <= 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -27,7 +28,7 @@
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESysProxyType.ForcedChange when Utils.IsLinux():
|
case ESysProxyType.ForcedChange when Utils.IsLinux():
|
||||||
await ProxySettingLinux.SetProxy(Global.Loopback, port);
|
await ProxySettingLinux.SetProxy(Global.Loopback, port, exceptions);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ESysProxyType.ForcedChange when Utils.IsOSX():
|
case ESysProxyType.ForcedChange when Utils.IsOSX():
|
||||||
|
@ -65,7 +66,7 @@
|
||||||
|
|
||||||
private static void GetWindowsProxyString(Config config, int port, out string strProxy, out string strExceptions)
|
private static void GetWindowsProxyString(Config config, int port, out string strProxy, out string strExceptions)
|
||||||
{
|
{
|
||||||
strExceptions = $"{config.ConstItem.DefIEProxyExceptions};{config.SystemProxyItem.SystemProxyExceptions}";
|
strExceptions = config.SystemProxyItem.SystemProxyExceptions;
|
||||||
if (config.SystemProxyItem.NotProxyLocalAddress)
|
if (config.SystemProxyItem.NotProxyLocalAddress)
|
||||||
{
|
{
|
||||||
strExceptions = $"<local>;{strExceptions}";
|
strExceptions = $"<local>;{strExceptions}";
|
||||||
|
|
9
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
9
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
|
@ -3058,6 +3058,15 @@ namespace ServiceLib.Resx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Exception. Do not use proxy server for addresses,with a comma (,) 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsExceptionTip2 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsExceptionTip2", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Follow System Theme 的本地化字符串。
|
/// 查找类似 Follow System Theme 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1380,11 +1380,14 @@
|
||||||
</data>
|
</data>
|
||||||
<data name="TransportExtraTip" xml:space="preserve">
|
<data name="TransportExtraTip" xml:space="preserve">
|
||||||
<value>جیسون خام XHTTP Extra, فرمت: { XHTTPObject }</value>
|
<value>جیسون خام XHTTP Extra, فرمت: { XHTTPObject }</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsHide2TrayWhenClose" xml:space="preserve">
|
<data name="TbSettingsHide2TrayWhenClose" xml:space="preserve">
|
||||||
<value>هنگام بستن پنجره در سینی پنهان شوید</value>
|
<value>هنگام بستن پنجره در سینی پنهان شوید</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
||||||
<value>تعداد در هر زمان برای دسته خودکار در طول تست سرعت (حداکثر 1000)</value>
|
<value>تعداد در هر زمان برای دسته خودکار در طول تست سرعت (حداکثر 1000)</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
<data name="TbSettingsExceptionTip2" xml:space="preserve">
|
||||||
|
<value>Exception. Do not use proxy server for addresses,with a comma (,)</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
|
@ -1387,4 +1387,7 @@
|
||||||
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
||||||
<value>Number per time for auto batch during speedtest(max 1000)</value>
|
<value>Number per time for auto batch during speedtest(max 1000)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsExceptionTip2" xml:space="preserve">
|
||||||
|
<value>Exception. Do not use proxy server for addresses,with a comma (,)</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1387,4 +1387,7 @@
|
||||||
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
||||||
<value>Number per time for auto batch during speedtest(max 1000)</value>
|
<value>Number per time for auto batch during speedtest(max 1000)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsExceptionTip2" xml:space="preserve">
|
||||||
|
<value>Exception. Do not use proxy server for addresses,with a comma (,)</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1384,4 +1384,7 @@
|
||||||
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
||||||
<value>测速时自动分批的每批数量(最大1000)</value>
|
<value>测速时自动分批的每批数量(最大1000)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsExceptionTip2" xml:space="preserve">
|
||||||
|
<value>例外. 对于下列地址不使用代理配置文件:使用逗号(,)分隔</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1384,4 +1384,7 @@
|
||||||
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
<data name="TbSettingsSpeedTestPageSize" xml:space="preserve">
|
||||||
<value>測速時自動分批的每批數量(最大1000)</value>
|
<value>測速時自動分批的每批數量(最大1000)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsExceptionTip2" xml:space="preserve">
|
||||||
|
<value>例外. 對於下列位址不使用代理設定檔:使用逗號(,)分隔</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -122,7 +122,7 @@ namespace ServiceLib.Services.CoreConfig
|
||||||
singboxConfig.inbounds.Clear();
|
singboxConfig.inbounds.Clear();
|
||||||
singboxConfig.outbounds.RemoveAt(0);
|
singboxConfig.outbounds.RemoveAt(0);
|
||||||
|
|
||||||
var httpPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.speedtest);
|
var initPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.speedtest);
|
||||||
|
|
||||||
foreach (var it in selecteds)
|
foreach (var it in selecteds)
|
||||||
{
|
{
|
||||||
|
@ -144,8 +144,8 @@ namespace ServiceLib.Services.CoreConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
//find unused port
|
//find unused port
|
||||||
var port = httpPort;
|
var port = initPort;
|
||||||
for (int k = httpPort; k < Global.MaxPort; k++)
|
for (int k = initPort; k < Global.MaxPort; k++)
|
||||||
{
|
{
|
||||||
if (lstIpEndPoints?.FindIndex(_it => _it.Port == k) >= 0)
|
if (lstIpEndPoints?.FindIndex(_it => _it.Port == k) >= 0)
|
||||||
{
|
{
|
||||||
|
@ -157,7 +157,7 @@ namespace ServiceLib.Services.CoreConfig
|
||||||
}
|
}
|
||||||
//found
|
//found
|
||||||
port = k;
|
port = k;
|
||||||
httpPort = port + 1;
|
initPort = port + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -248,7 +248,7 @@ namespace ServiceLib.Services.CoreConfig
|
||||||
v2rayConfig.outbounds.Clear();
|
v2rayConfig.outbounds.Clear();
|
||||||
v2rayConfig.routing.rules.Clear();
|
v2rayConfig.routing.rules.Clear();
|
||||||
|
|
||||||
var httpPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.speedtest);
|
var initPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.speedtest);
|
||||||
|
|
||||||
foreach (var it in selecteds)
|
foreach (var it in selecteds)
|
||||||
{
|
{
|
||||||
|
@ -270,8 +270,8 @@ namespace ServiceLib.Services.CoreConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
//find unused port
|
//find unused port
|
||||||
var port = httpPort;
|
var port = initPort;
|
||||||
for (var k = httpPort; k < Global.MaxPort; k++)
|
for (var k = initPort; k < Global.MaxPort; k++)
|
||||||
{
|
{
|
||||||
if (lstIpEndPoints?.FindIndex(_it => _it.Port == k) >= 0)
|
if (lstIpEndPoints?.FindIndex(_it => _it.Port == k) >= 0)
|
||||||
{
|
{
|
||||||
|
@ -283,7 +283,7 @@ namespace ServiceLib.Services.CoreConfig
|
||||||
}
|
}
|
||||||
//found
|
//found
|
||||||
port = k;
|
port = k;
|
||||||
httpPort = port + 1;
|
initPort = port + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -280,13 +280,13 @@ namespace ServiceLib.Services
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var httpPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks);
|
var port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks);
|
||||||
if (await SocketCheck(Global.Loopback, httpPort) == false)
|
if (await SocketCheck(Global.Loopback, port) == false)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new WebProxy(Global.Loopback, httpPort);
|
return new WebProxy($"socks5://{Global.Loopback}:{port}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> SocketCheck(string ip, int port)
|
private async Task<bool> SocketCheck(string ip, int port)
|
||||||
|
|
|
@ -191,7 +191,7 @@ namespace ServiceLib.Services
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
WebProxy webProxy = new(Global.Loopback, it.Port);
|
var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}");
|
||||||
var output = await GetRealPingTime(downloadHandle, webProxy);
|
var output = await GetRealPingTime(downloadHandle, webProxy);
|
||||||
|
|
||||||
ProfileExHandler.Instance.SetTestDelay(it.IndexId, output);
|
ProfileExHandler.Instance.SetTestDelay(it.IndexId, output);
|
||||||
|
@ -262,7 +262,7 @@ namespace ServiceLib.Services
|
||||||
var item = await AppHandler.Instance.GetProfileItem(it.IndexId);
|
var item = await AppHandler.Instance.GetProfileItem(it.IndexId);
|
||||||
if (item is null) continue;
|
if (item is null) continue;
|
||||||
|
|
||||||
WebProxy webProxy = new(Global.Loopback, it.Port);
|
var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}");
|
||||||
|
|
||||||
await downloadHandle.DownloadDataAsync(url, webProxy, timeout, (success, msg) =>
|
await downloadHandle.DownloadDataAsync(url, webProxy, timeout, (success, msg) =>
|
||||||
{
|
{
|
||||||
|
@ -324,7 +324,7 @@ namespace ServiceLib.Services
|
||||||
var item = await AppHandler.Instance.GetProfileItem(it.IndexId);
|
var item = await AppHandler.Instance.GetProfileItem(it.IndexId);
|
||||||
if (item is null) continue;
|
if (item is null) continue;
|
||||||
|
|
||||||
WebProxy webProxy = new(Global.Loopback, it.Port);
|
var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}");
|
||||||
_ = downloadHandle.DownloadDataAsync(url, webProxy, timeout, (success, msg) =>
|
_ = downloadHandle.DownloadDataAsync(url, webProxy, timeout, (success, msg) =>
|
||||||
{
|
{
|
||||||
decimal.TryParse(msg, out var dec);
|
decimal.TryParse(msg, out var dec);
|
||||||
|
|
|
@ -697,7 +697,10 @@
|
||||||
|
|
||||||
<TabItem Name="tabSystemproxy" Header="{x:Static resx:ResUI.TbSettingsSystemproxy}">
|
<TabItem Name="tabSystemproxy" Header="{x:Static resx:ResUI.TbSettingsSystemproxy}">
|
||||||
<DockPanel Classes="Margin8">
|
<DockPanel Classes="Margin8">
|
||||||
<StackPanel DockPanel.Dock="Bottom" Orientation="Vertical">
|
<StackPanel
|
||||||
|
Name="panSystemProxyAdvanced"
|
||||||
|
DockPanel.Dock="Bottom"
|
||||||
|
Orientation="Vertical">
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<TextBlock
|
<TextBlock
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
|
@ -723,11 +726,17 @@
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="1"
|
Name="txbSettingsExceptionTip"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Classes="Margin8"
|
Classes="Margin8"
|
||||||
DockPanel.Dock="Top"
|
DockPanel.Dock="Top"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsExceptionTip}" />
|
Text="{x:Static resx:ResUI.TbSettingsExceptionTip}" />
|
||||||
|
<TextBlock
|
||||||
|
Name="txbSettingsExceptionTip2"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Classes="Margin8"
|
||||||
|
DockPanel.Dock="Top"
|
||||||
|
Text="{x:Static resx:ResUI.TbSettingsExceptionTip2}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtsystemProxyExceptions"
|
x:Name="txtsystemProxyExceptions"
|
||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
|
|
|
@ -166,9 +166,14 @@ namespace v2rayN.Desktop.Views
|
||||||
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!Utils.IsWindows())
|
if (Utils.IsWindows())
|
||||||
{
|
{
|
||||||
tabSystemproxy.IsVisible = false;
|
txbSettingsExceptionTip2.IsVisible = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
txbSettingsExceptionTip.IsVisible = false;
|
||||||
|
panSystemProxyAdvanced.IsVisible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Utils.IsOSX())
|
if (Utils.IsOSX())
|
||||||
|
|
Loading…
Reference in a new issue