From c40d88d0b6d0401a7f61cc9e6e8ce7155686571f Mon Sep 17 00:00:00 2001 From: chao wan <1013448513@qq.com> Date: Fri, 3 Mar 2023 18:03:29 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=83=AD=E9=94=AE?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=EF=BC=88=E6=9C=AA=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + v2rayN/v2rayN/Handler/HotkeyHandler.cs | 137 ++++++++++++++++++ v2rayN/v2rayN/Handler/MainFormHandler.cs | 45 +----- v2rayN/v2rayN/Mode/ConfigItems.cs | 5 +- .../v2rayN/ViewModels/MainWindowViewModel.cs | 15 +- .../Views/GlobalHotkeySettingWindow.xaml.cs | 49 +++---- 6 files changed, 175 insertions(+), 77 deletions(-) create mode 100644 v2rayN/v2rayN/Handler/HotkeyHandler.cs diff --git a/.gitignore b/.gitignore index 42698ddd..4f3e075c 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ /v2rayN/v2rayUpgrade/bin/Release /v2rayN/v2rayUpgrade/obj/ *.user +/.vs/v2rayN diff --git a/v2rayN/v2rayN/Handler/HotkeyHandler.cs b/v2rayN/v2rayN/Handler/HotkeyHandler.cs new file mode 100644 index 00000000..5b5a4e0f --- /dev/null +++ b/v2rayN/v2rayN/Handler/HotkeyHandler.cs @@ -0,0 +1,137 @@ +using System.ComponentModel; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows; +using System.Windows.Input; +using System.Windows.Interop; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Handler +{ + public sealed class HotkeyHandler + { + private static readonly Lazy _instance = new(() => new()); + public static HotkeyHandler Instance = _instance.Value; + + private const int WmHotkey = 0x0312; + private Config _config + { + get => LazyConfig.Instance.GetConfig(); + } + private Dictionary> _hotkeyTriggerDic; + + public bool IsPause { get; private set; } = false; + public event Action? UpdateViewEvent; + public event Action? HotkeyTriggerEvent; + public HotkeyHandler() + { + _hotkeyTriggerDic = new(); + ComponentDispatcher.ThreadPreprocessMessage += OnThreadPreProcessMessage; + Init(); + } + + private void Init() + { + _hotkeyTriggerDic.Clear(); + if (_config.globalHotkeys == null) return; + foreach(var item in _config.globalHotkeys) + { + if (item.KeyCode != null && item.KeyCode != Key.None) + { + int key = KeyInterop.VirtualKeyFromKey((Key)item.KeyCode); + KeyModifiers modifiers = KeyModifiers.None; + if (item.Control) modifiers |= KeyModifiers.Ctrl; + if (item.Shift) modifiers |= KeyModifiers.Shift; + if (item.Alt) modifiers |= KeyModifiers.Alt; + key = (key << 16) | (int)modifiers; + if (!_hotkeyTriggerDic.ContainsKey(key)) + { + _hotkeyTriggerDic.Add(key, new() { item.eGlobalHotkey }); + } + else + { + if (!_hotkeyTriggerDic[key].Contains(item.eGlobalHotkey)) + _hotkeyTriggerDic[key].Add(item.eGlobalHotkey); + } + } + } + } + public void Load() + { + foreach(var hotkey in _hotkeyTriggerDic.Keys) + { + var _fsModifiers = hotkey & 0xffff; + var _vkey = (hotkey >> 16) & 0xffff; + var hotkeyStr = HotkeyToString(_fsModifiers, _vkey); + bool isSuccess = false; + string msg; + + Application.Current.Dispatcher.Invoke(() => + { + isSuccess = RegisterHotKey(IntPtr.Zero, hotkey, _fsModifiers, _vkey); + }); + if (isSuccess) + { + msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{hotkeyStr}"); + } + else + { + var errInfo = new Win32Exception(Marshal.GetLastWin32Error()).Message; + msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{hotkeyStr}", errInfo); + } + UpdateViewEvent?.Invoke(false, msg); + } + } + + public void ReLoad() + { + foreach(var hotkey in _hotkeyTriggerDic.Keys) + { + Application.Current.Dispatcher.Invoke(() => + { + UnregisterHotKey(IntPtr.Zero, hotkey); + }); + } + Init(); + Load(); + } + + private void OnThreadPreProcessMessage(ref MSG msg, ref bool handled) + { + if (msg.message != WmHotkey || IsPause || !_hotkeyTriggerDic.Keys.Contains((int)msg.lParam)) + return; + handled = true; + foreach (var keyEvent in _hotkeyTriggerDic[(int)msg.lParam]) + { + HotkeyTriggerEvent?.Invoke(keyEvent); + } + } + [DllImport("user32.dll", SetLastError = true)] + private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); + + [DllImport("user32.dll", SetLastError = true)] + private static extern bool UnregisterHotKey(IntPtr hWnd, int id); + private static string HotkeyToString(int fsModifiers,int vk) + { + var sb = new StringBuilder(); + var mdif = (KeyModifiers)fsModifiers; + var key = KeyInterop.KeyFromVirtualKey(vk); + if ((mdif | KeyModifiers.Ctrl) == KeyModifiers.Ctrl) sb.Append($"{KeyModifiers.Ctrl}+"); + if ((mdif | KeyModifiers.Alt) == KeyModifiers.Alt) sb.Append($"{KeyModifiers.Alt}+"); + if ((mdif | KeyModifiers.Shift) == KeyModifiers.Shift) sb.Append($"{KeyModifiers.Shift}+"); + sb.Append(key.ToString()); + return sb.ToString(); + } + [Flags] + private enum KeyModifiers + { + None = 0x0000, + Alt = 0x0001, + Ctrl = 0x0002, + Shift = 0x0004, + Win = 0x0008, + NoRepeat = 0x4000 + } + } +} diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index cdf7215c..e04d9466 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -343,48 +343,11 @@ namespace v2rayN.Handler } } - public void RegisterGlobalHotkey(Config config, EventHandler handler, Action update) + public void RegisterGlobalHotkey(Config config, Action handler, Action update) { - if (config.globalHotkeys == null) - { - return; - } - - foreach (var item in config.globalHotkeys) - { - if (item.KeyCode == null) - { - continue; - } - - var modifiers = ModifierKeys.None; - if (item.Control) - { - modifiers |= ModifierKeys.Control; - } - if (item.Alt) - { - modifiers |= ModifierKeys.Alt; - } - if (item.Shift) - { - modifiers |= ModifierKeys.Shift; - } - - var gesture = new KeyGesture(KeyInterop.KeyFromVirtualKey((int)item.KeyCode), modifiers); - try - { - HotkeyManager.Current.AddOrReplace(((int)item.eGlobalHotkey).ToString(), gesture, handler); - var msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{item.eGlobalHotkey}"); - update(false, msg); - } - catch (Exception ex) - { - var msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{item.eGlobalHotkey}", ex.Message); - update(false, msg); - Utils.SaveLog(msg); - } - } + HotkeyHandler.Instance.UpdateViewEvent += update; + HotkeyHandler.Instance.HotkeyTriggerEvent += handler; + HotkeyHandler.Instance.Load(); } } diff --git a/v2rayN/v2rayN/Mode/ConfigItems.cs b/v2rayN/v2rayN/Mode/ConfigItems.cs index 3f9e9eac..198d3dd9 100644 --- a/v2rayN/v2rayN/Mode/ConfigItems.cs +++ b/v2rayN/v2rayN/Mode/ConfigItems.cs @@ -1,5 +1,4 @@ -using System.Windows.Forms; - +using System.Windows.Input; namespace v2rayN.Mode { [Serializable] @@ -144,7 +143,7 @@ namespace v2rayN.Mode public bool Shift { get; set; } - public Keys? KeyCode { get; set; } + public Key? KeyCode { get; set; } } diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index e50dc36a..c670f83d 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -630,27 +630,26 @@ namespace v2rayN.ViewModels } } - private void OnHotkeyHandler(object sender, HotkeyEventArgs e) + private void OnHotkeyHandler(EGlobalHotkey e) { - switch (Utils.ToInt(e.Name)) + switch (e) { - case (int)EGlobalHotkey.ShowForm: + case EGlobalHotkey.ShowForm: ShowHideWindow(null); break; - case (int)EGlobalHotkey.SystemProxyClear: + case EGlobalHotkey.SystemProxyClear: SetListenerType(ESysProxyType.ForcedClear); break; - case (int)EGlobalHotkey.SystemProxySet: + case EGlobalHotkey.SystemProxySet: SetListenerType(ESysProxyType.ForcedChange); break; - case (int)EGlobalHotkey.SystemProxyUnchanged: + case EGlobalHotkey.SystemProxyUnchanged: SetListenerType(ESysProxyType.Unchanged); break; - case (int)EGlobalHotkey.SystemProxyPac: + case EGlobalHotkey.SystemProxyPac: SetListenerType(ESysProxyType.Pac); break; } - e.Handled = true; } public void MyAppExit(bool blWindowsShutDown) { diff --git a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs index 16cc7fce..54b48283 100644 --- a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs @@ -1,4 +1,5 @@ -using System.Windows; +using Microsoft.Win32.TaskScheduler; +using System.Windows; using System.Windows.Controls; using System.Windows.Input; using v2rayN.Handler; @@ -12,37 +13,23 @@ namespace v2rayN.Views { private static Config _config; List lstKey; + private Dictionary _TextBoxKeyEventItem; public GlobalHotkeySettingWindow() { InitializeComponent(); this.Owner = Application.Current.MainWindow; _config = LazyConfig.Instance.GetConfig(); + _config.globalHotkeys ??= new List(); - if (_config.globalHotkeys == null) + _TextBoxKeyEventItem = new() { - _config.globalHotkeys = new List(); - } - - foreach (EGlobalHotkey it in Enum.GetValues(typeof(EGlobalHotkey))) - { - if (_config.globalHotkeys.FindIndex(t => t.eGlobalHotkey == it) >= 0) - { - continue; - } - - _config.globalHotkeys.Add(new KeyEventItem() - { - eGlobalHotkey = it, - Alt = false, - Control = false, - Shift = false, - KeyCode = null - }); - } - - lstKey = Utils.DeepCopy(_config.globalHotkeys); - + { txtGlobalHotkey0,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.ShowForm) }, + { txtGlobalHotkey1,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxyClear) }, + { txtGlobalHotkey2,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxySet) }, + { txtGlobalHotkey3,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxyUnchanged)}, + { txtGlobalHotkey4,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxyPac)} + }; txtGlobalHotkey0.KeyDown += TxtGlobalHotkey_KeyDown; txtGlobalHotkey1.KeyDown += TxtGlobalHotkey_KeyDown; txtGlobalHotkey2.KeyDown += TxtGlobalHotkey_KeyDown; @@ -63,7 +50,7 @@ namespace v2rayN.Views { var txt = ((TextBox)sender); var index = Utils.ToInt(txt.Name.Substring(txt.Name.Length - 1, 1)); - var formsKey = (Forms.Keys)KeyInterop.VirtualKeyFromKey(e.Key == Key.System ? e.SystemKey : e.Key); + var formsKey = e.Key == Key.System ? e.SystemKey : e.Key; lstKey[index].KeyCode = formsKey; lstKey[index].Alt = (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt; @@ -74,6 +61,18 @@ namespace v2rayN.Views } } + private KeyEventItem GetKeyEventItemByEGlobalHotkey(List KELsit,EGlobalHotkey eg) + { + return Utils.DeepCopy(KELsit.Find((it) => it.eGlobalHotkey == eg) ?? new() + { + eGlobalHotkey = eg, + Control = false, + Alt = false, + Shift = false, + KeyCode = null + }); + + } private void BindingData(int index) { for (int k = 0; k < lstKey.Count; k++) From ba702ba041c9e2a413512ea8e26d457c9def68be Mon Sep 17 00:00:00 2001 From: chao wan <1013448513@qq.com> Date: Sat, 4 Mar 2023 00:40:06 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E7=83=AD=E9=94=AE=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v2rayN/v2rayN/Handler/HotkeyHandler.cs | 69 ++++++---- v2rayN/v2rayN/Handler/MainFormHandler.cs | 3 +- .../v2rayN/ViewModels/MainWindowViewModel.cs | 1 - .../Views/GlobalHotkeySettingWindow.xaml.cs | 129 +++++++----------- v2rayN/v2rayN/v2rayN.csproj | 2 - 5 files changed, 94 insertions(+), 110 deletions(-) diff --git a/v2rayN/v2rayN/Handler/HotkeyHandler.cs b/v2rayN/v2rayN/Handler/HotkeyHandler.cs index 5b5a4e0f..55f6576b 100644 --- a/v2rayN/v2rayN/Handler/HotkeyHandler.cs +++ b/v2rayN/v2rayN/Handler/HotkeyHandler.cs @@ -21,7 +21,7 @@ namespace v2rayN.Handler } private Dictionary> _hotkeyTriggerDic; - public bool IsPause { get; private set; } = false; + public bool IsPause { get; set; } = false; public event Action? UpdateViewEvent; public event Action? HotkeyTriggerEvent; public HotkeyHandler() @@ -61,26 +61,28 @@ namespace v2rayN.Handler { foreach(var hotkey in _hotkeyTriggerDic.Keys) { - var _fsModifiers = hotkey & 0xffff; - var _vkey = (hotkey >> 16) & 0xffff; - var hotkeyStr = HotkeyToString(_fsModifiers, _vkey); + var hotkeyInfo = GetHotkeyInfo(hotkey); bool isSuccess = false; string msg; Application.Current.Dispatcher.Invoke(() => { - isSuccess = RegisterHotKey(IntPtr.Zero, hotkey, _fsModifiers, _vkey); - }); - if (isSuccess) + isSuccess = RegisterHotKey(IntPtr.Zero, hotkey, hotkeyInfo.fsModifiers, hotkeyInfo.vKey); + }); + foreach (var name in hotkeyInfo.Names) { - msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{hotkeyStr}"); + if (isSuccess) + { + msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{name}({hotkeyInfo.HotkeyStr})"); + } + else + { + var errInfo = new Win32Exception(Marshal.GetLastWin32Error()).Message; + msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{name}({hotkeyInfo.HotkeyStr})", errInfo); + } + UpdateViewEvent?.Invoke(false, msg); } - else - { - var errInfo = new Win32Exception(Marshal.GetLastWin32Error()).Message; - msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{hotkeyStr}", errInfo); - } - UpdateViewEvent?.Invoke(false, msg); + } } @@ -96,14 +98,38 @@ namespace v2rayN.Handler Init(); Load(); } - + private (int fsModifiers, int vKey, string HotkeyStr, List Names) GetHotkeyInfo(int hotkey) + { + var _fsModifiers = hotkey & 0xffff; + var _vkey = (hotkey >> 16) & 0xffff; + var _hotkeyStr = new StringBuilder(); + var _names = new List(); + + var mdif = (KeyModifiers)_fsModifiers; + var key = KeyInterop.KeyFromVirtualKey(_vkey); + if ((mdif | KeyModifiers.Ctrl) == KeyModifiers.Ctrl) _hotkeyStr.Append($"{KeyModifiers.Ctrl}+"); + if ((mdif | KeyModifiers.Alt) == KeyModifiers.Alt) _hotkeyStr.Append($"{KeyModifiers.Alt}+"); + if ((mdif | KeyModifiers.Shift) == KeyModifiers.Shift) _hotkeyStr.Append($"{KeyModifiers.Shift}+"); + _hotkeyStr.Append(key.ToString()); + + foreach (var name in _hotkeyTriggerDic.Values) + { + _names.Add(name.ToString()!); + } + + + return (_fsModifiers, _vkey, _hotkeyStr.ToString(), _names); + } private void OnThreadPreProcessMessage(ref MSG msg, ref bool handled) { - if (msg.message != WmHotkey || IsPause || !_hotkeyTriggerDic.Keys.Contains((int)msg.lParam)) + if (msg.message != WmHotkey|| !_hotkeyTriggerDic.ContainsKey((int)msg.lParam)) + { return; + } handled = true; foreach (var keyEvent in _hotkeyTriggerDic[(int)msg.lParam]) { + if (IsPause) return; HotkeyTriggerEvent?.Invoke(keyEvent); } } @@ -112,17 +138,6 @@ namespace v2rayN.Handler [DllImport("user32.dll", SetLastError = true)] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); - private static string HotkeyToString(int fsModifiers,int vk) - { - var sb = new StringBuilder(); - var mdif = (KeyModifiers)fsModifiers; - var key = KeyInterop.KeyFromVirtualKey(vk); - if ((mdif | KeyModifiers.Ctrl) == KeyModifiers.Ctrl) sb.Append($"{KeyModifiers.Ctrl}+"); - if ((mdif | KeyModifiers.Alt) == KeyModifiers.Alt) sb.Append($"{KeyModifiers.Alt}+"); - if ((mdif | KeyModifiers.Shift) == KeyModifiers.Shift) sb.Append($"{KeyModifiers.Shift}+"); - sb.Append(key.ToString()); - return sb.ToString(); - } [Flags] private enum KeyModifiers { diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index e04d9466..6f3a47b8 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -1,5 +1,4 @@ -using NHotkey; -using NHotkey.Wpf; + using System.Drawing; using System.IO; using System.Windows.Forms; diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index c670f83d..17bd0e39 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -3,7 +3,6 @@ using DynamicData.Binding; using MaterialDesignColors; using MaterialDesignColors.ColorManipulation; using MaterialDesignThemes.Wpf; -using NHotkey; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Splat; diff --git a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs index 54b48283..81d3518e 100644 --- a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs @@ -1,4 +1,6 @@ using Microsoft.Win32.TaskScheduler; +using System.Diagnostics; +using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -11,9 +13,8 @@ namespace v2rayN.Views { public partial class GlobalHotkeySettingWindow { - private static Config _config; - List lstKey; - private Dictionary _TextBoxKeyEventItem; + private static Config _config = default!; + private Dictionary _TextBoxKeyEventItem = default!; public GlobalHotkeySettingWindow() { @@ -21,7 +22,21 @@ namespace v2rayN.Views this.Owner = Application.Current.MainWindow; _config = LazyConfig.Instance.GetConfig(); _config.globalHotkeys ??= new List(); + + txtGlobalHotkey0.PreviewKeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey1.PreviewKeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey2.PreviewKeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey3.PreviewKeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey4.PreviewKeyDown += TxtGlobalHotkey_KeyDown; + this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false; + HotkeyHandler.Instance.IsPause = true; + Utils.SetDarkBorder(this, _config.uiItem.colorModeDark); + InitData(); + } + + private void InitData() + { _TextBoxKeyEventItem = new() { { txtGlobalHotkey0,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.ShowForm) }, @@ -30,35 +45,20 @@ namespace v2rayN.Views { txtGlobalHotkey3,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxyUnchanged)}, { txtGlobalHotkey4,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxyPac)} }; - txtGlobalHotkey0.KeyDown += TxtGlobalHotkey_KeyDown; - txtGlobalHotkey1.KeyDown += TxtGlobalHotkey_KeyDown; - txtGlobalHotkey2.KeyDown += TxtGlobalHotkey_KeyDown; - txtGlobalHotkey3.KeyDown += TxtGlobalHotkey_KeyDown; - txtGlobalHotkey4.KeyDown += TxtGlobalHotkey_KeyDown; - - BindingData(-1); - - Utils.SetDarkBorder(this, _config.uiItem.colorModeDark); + BindingData(); } private void TxtGlobalHotkey_KeyDown(object sender, KeyEventArgs e) { + Debug.WriteLine($"{e.Key}{e.SystemKey}"); e.Handled = true; var _ModifierKeys = new Key[] { Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, Key.RightShift, Key.LeftAlt, Key.RightAlt }; - if (!_ModifierKeys.Contains(e.Key) && !_ModifierKeys.Contains(e.SystemKey)) - { - var txt = ((TextBox)sender); - var index = Utils.ToInt(txt.Name.Substring(txt.Name.Length - 1, 1)); - var formsKey = e.Key == Key.System ? e.SystemKey : e.Key; - - lstKey[index].KeyCode = formsKey; - lstKey[index].Alt = (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt; - lstKey[index].Control = (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control; - lstKey[index].Shift = (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift; - - BindingData(index); - } + _TextBoxKeyEventItem[sender].KeyCode = e.Key == Key.System ? (_ModifierKeys.Contains(e.SystemKey) ? Key.None : e.SystemKey) : (_ModifierKeys.Contains(e.Key) ? Key.None : e.Key); + _TextBoxKeyEventItem[sender].Alt = (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt; + _TextBoxKeyEventItem[sender].Control = (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control; + _TextBoxKeyEventItem[sender].Shift = (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift; + (sender as TextBox)!.Text = KeyEventItemToString(_TextBoxKeyEventItem[sender]); } private KeyEventItem GetKeyEventItemByEGlobalHotkey(List KELsit,EGlobalHotkey eg) @@ -73,44 +73,40 @@ namespace v2rayN.Views }); } - private void BindingData(int index) + private string KeyEventItemToString(KeyEventItem item) { - for (int k = 0; k < lstKey.Count; k++) + var res = new StringBuilder(); + + if (item.Control) res.Append($"{ModifierKeys.Control}+"); + if (item.Shift) res.Append($"{ModifierKeys.Shift}+"); + if (item.Alt) res.Append($"{ModifierKeys.Alt}+"); + if(item.KeyCode != null && item.KeyCode != Key.None) + res.Append($"{item.KeyCode}"); + + return res.ToString(); + } + private void BindingData() + { + foreach(var item in _TextBoxKeyEventItem) { - if (index >= 0 && index != k) + if (item.Value.KeyCode != null && item.Value.KeyCode != Key.None) { - continue; + (item.Key as TextBox)!.Text = KeyEventItemToString(item.Value); } - var item = lstKey[k]; - var keys = string.Empty; - - if (item.Control) + else { - keys += $"{Forms.Keys.Control} + "; + (item.Key as TextBox)!.Text = string.Empty; } - if (item.Alt) - { - keys += $"{Forms.Keys.Alt} + "; - } - if (item.Shift) - { - keys += $"{Forms.Keys.Shift} + "; - } - if (item.KeyCode != null) - { - keys += $"{item.KeyCode}"; - } - - SetText($"txtGlobalHotkey{k}", keys); } } private void btnSave_Click(object sender, RoutedEventArgs e) { - _config.globalHotkeys = lstKey; + _config.globalHotkeys = _TextBoxKeyEventItem.Values.ToList(); if (ConfigHandler.SaveConfig(ref _config, false) == 0) { + HotkeyHandler.Instance.ReLoad(); this.DialogResult = true; } else @@ -126,37 +122,14 @@ namespace v2rayN.Views private void btnReset_Click(object sender, RoutedEventArgs e) { - lstKey.Clear(); - foreach (EGlobalHotkey it in Enum.GetValues(typeof(EGlobalHotkey))) + foreach(var k in _TextBoxKeyEventItem.Keys) { - if (lstKey.FindIndex(t => t.eGlobalHotkey == it) >= 0) - { - continue; - } - - lstKey.Add(new KeyEventItem() - { - eGlobalHotkey = it, - Alt = false, - Control = false, - Shift = false, - KeyCode = null - }); - } - BindingData(-1); - } - private void SetText(string name, string txt) - { - foreach (UIElement element in gridText.Children) - { - if (element is TextBox box) - { - if (box.Name == name) - { - box.Text = txt; - } - } + _TextBoxKeyEventItem[k].Alt = false; + _TextBoxKeyEventItem[k].Control= false; + _TextBoxKeyEventItem[k].Shift = false; + _TextBoxKeyEventItem[k].KeyCode = Key.None; } + BindingData(); } private void GlobalHotkeySettingWindow_KeyDown(object sender, KeyEventArgs e) diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 405266e0..1d20dca3 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -18,8 +18,6 @@ - - From 5e9f4ad926e408e36fff33d9fe8f24f11abba4e7 Mon Sep 17 00:00:00 2001 From: chao wan <1013448513@qq.com> Date: Sat, 4 Mar 2023 11:46:36 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E5=B7=B2=E6=B3=A8=E5=86=8C=E7=83=AD=E9=94=AE=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=A7=A6=E5=8F=91UI=E7=BA=BF=E7=A8=8B=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E7=9A=84KeyDown=E4=BA=8B=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v2rayN/v2rayN/Handler/HotkeyHandler.cs | 46 +++++++++++++------ .../Views/GlobalHotkeySettingWindow.xaml.cs | 13 +++--- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/v2rayN/v2rayN/Handler/HotkeyHandler.cs b/v2rayN/v2rayN/Handler/HotkeyHandler.cs index 55f6576b..57944dab 100644 --- a/v2rayN/v2rayN/Handler/HotkeyHandler.cs +++ b/v2rayN/v2rayN/Handler/HotkeyHandler.cs @@ -59,26 +59,26 @@ namespace v2rayN.Handler } public void Load() { - foreach(var hotkey in _hotkeyTriggerDic.Keys) + foreach(var _hotkeyCode in _hotkeyTriggerDic.Keys) { - var hotkeyInfo = GetHotkeyInfo(hotkey); + var hotkeyInfo = GetHotkeyInfo(_hotkeyCode); bool isSuccess = false; string msg; Application.Current.Dispatcher.Invoke(() => { - isSuccess = RegisterHotKey(IntPtr.Zero, hotkey, hotkeyInfo.fsModifiers, hotkeyInfo.vKey); + isSuccess = RegisterHotKey(IntPtr.Zero, _hotkeyCode, hotkeyInfo.fsModifiers, hotkeyInfo.vKey); }); foreach (var name in hotkeyInfo.Names) { if (isSuccess) { - msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{name}({hotkeyInfo.HotkeyStr})"); + msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{name}({hotkeyInfo.hotkeyStr})"); } else { var errInfo = new Win32Exception(Marshal.GetLastWin32Error()).Message; - msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{name}({hotkeyInfo.HotkeyStr})", errInfo); + msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{name}({hotkeyInfo.hotkeyStr})", errInfo); } UpdateViewEvent?.Invoke(false, msg); } @@ -98,10 +98,10 @@ namespace v2rayN.Handler Init(); Load(); } - private (int fsModifiers, int vKey, string HotkeyStr, List Names) GetHotkeyInfo(int hotkey) + private (int fsModifiers, int vKey, string hotkeyStr, List Names) GetHotkeyInfo(int hotkeycode) { - var _fsModifiers = hotkey & 0xffff; - var _vkey = (hotkey >> 16) & 0xffff; + var _fsModifiers = hotkeycode & 0xffff; + var _vkey = (hotkeycode >> 16) & 0xffff; var _hotkeyStr = new StringBuilder(); var _names = new List(); @@ -112,9 +112,9 @@ namespace v2rayN.Handler if ((mdif | KeyModifiers.Shift) == KeyModifiers.Shift) _hotkeyStr.Append($"{KeyModifiers.Shift}+"); _hotkeyStr.Append(key.ToString()); - foreach (var name in _hotkeyTriggerDic.Values) + foreach (var name in _hotkeyTriggerDic[hotkeycode]) { - _names.Add(name.ToString()!); + _names.Add(name.ToString()); } @@ -127,10 +127,30 @@ namespace v2rayN.Handler return; } handled = true; - foreach (var keyEvent in _hotkeyTriggerDic[(int)msg.lParam]) + var _hotKeyCode = (int)msg.lParam; + if (IsPause) { - if (IsPause) return; - HotkeyTriggerEvent?.Invoke(keyEvent); + Application.Current.Dispatcher.Invoke(() => + { + UIElement? element = Keyboard.FocusedElement as UIElement; + if (element != null) + { + var _keyEventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, + PresentationSource.FromVisual(element), 0, + KeyInterop.KeyFromVirtualKey(GetHotkeyInfo(_hotKeyCode).vKey)) + { + RoutedEvent = UIElement.KeyDownEvent + }; + element.RaiseEvent(_keyEventArgs); + } + }); + } + else + { + foreach (var keyEvent in _hotkeyTriggerDic[(int)msg.lParam]) + { + HotkeyTriggerEvent?.Invoke(keyEvent); + } } } [DllImport("user32.dll", SetLastError = true)] diff --git a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs index 81d3518e..c0af6c08 100644 --- a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs @@ -23,11 +23,11 @@ namespace v2rayN.Views _config = LazyConfig.Instance.GetConfig(); _config.globalHotkeys ??= new List(); - txtGlobalHotkey0.PreviewKeyDown += TxtGlobalHotkey_KeyDown; - txtGlobalHotkey1.PreviewKeyDown += TxtGlobalHotkey_KeyDown; - txtGlobalHotkey2.PreviewKeyDown += TxtGlobalHotkey_KeyDown; - txtGlobalHotkey3.PreviewKeyDown += TxtGlobalHotkey_KeyDown; - txtGlobalHotkey4.PreviewKeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey0.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey1.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey2.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey3.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey4.KeyDown += TxtGlobalHotkey_KeyDown; this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false; HotkeyHandler.Instance.IsPause = true; @@ -53,7 +53,8 @@ namespace v2rayN.Views { Debug.WriteLine($"{e.Key}{e.SystemKey}"); e.Handled = true; - var _ModifierKeys = new Key[] { Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, Key.RightShift, Key.LeftAlt, Key.RightAlt }; + var _ModifierKeys = new Key[] { Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, + Key.RightShift, Key.LeftAlt, Key.RightAlt, Key.LWin, Key.RWin}; _TextBoxKeyEventItem[sender].KeyCode = e.Key == Key.System ? (_ModifierKeys.Contains(e.SystemKey) ? Key.None : e.SystemKey) : (_ModifierKeys.Contains(e.Key) ? Key.None : e.Key); _TextBoxKeyEventItem[sender].Alt = (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt; _TextBoxKeyEventItem[sender].Control = (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control; From 0bf4a43663fde734c0c8ee3e7e006495f6a6e03d Mon Sep 17 00:00:00 2001 From: chao wan <1013448513@qq.com> Date: Sat, 4 Mar 2023 11:52:46 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs index c0af6c08..c067a562 100644 --- a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs @@ -7,7 +7,6 @@ using System.Windows.Input; using v2rayN.Handler; using v2rayN.Mode; using v2rayN.Resx; -using Forms = System.Windows.Forms; namespace v2rayN.Views { @@ -29,8 +28,8 @@ namespace v2rayN.Views txtGlobalHotkey3.KeyDown += TxtGlobalHotkey_KeyDown; txtGlobalHotkey4.KeyDown += TxtGlobalHotkey_KeyDown; - this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false; HotkeyHandler.Instance.IsPause = true; + this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false; Utils.SetDarkBorder(this, _config.uiItem.colorModeDark); InitData(); } @@ -51,7 +50,6 @@ namespace v2rayN.Views private void TxtGlobalHotkey_KeyDown(object sender, KeyEventArgs e) { - Debug.WriteLine($"{e.Key}{e.SystemKey}"); e.Handled = true; var _ModifierKeys = new Key[] { Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, Key.RightShift, Key.LeftAlt, Key.RightAlt, Key.LWin, Key.RWin}; From 800c93e2aad8f71bd10de8329b214f3d4b119327 Mon Sep 17 00:00:00 2001 From: Minghao Hu Date: Sun, 5 Mar 2023 13:57:58 +0800 Subject: [PATCH 05/18] Add a control to simulate system tool tip. --- v2rayN/v2rayN/Views/MainWindow.xaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml b/v2rayN/v2rayN/Views/MainWindow.xaml index 1cb9c647..4ef1752c 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml +++ b/v2rayN/v2rayN/Views/MainWindow.xaml @@ -831,6 +831,21 @@ Header="{x:Static resx:ResUI.menuExit}" /> + + + + + From f84397393da1f0eb1c39b5881cea189d55081124 Mon Sep 17 00:00:00 2001 From: Minghao Hu Date: Sun, 5 Mar 2023 14:19:59 +0800 Subject: [PATCH 06/18] Niche. --- v2rayN/v2rayN/Views/MainWindow.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml b/v2rayN/v2rayN/Views/MainWindow.xaml index 4ef1752c..c0d96e68 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml +++ b/v2rayN/v2rayN/Views/MainWindow.xaml @@ -837,8 +837,8 @@ BorderBrush="Black" BorderThickness="2" CornerRadius="2" - Width="auto" - Height="auto"> + Width="Auto" + Height="Auto"> Date: Sun, 5 Mar 2023 19:51:26 +0800 Subject: [PATCH 07/18] bug fixes --- v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs | 4 ++++ v2rayN/v2rayN/Views/MainWindow.xaml | 14 +++++++------- v2rayN/v2rayN/Views/MainWindow.xaml.cs | 1 + 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index 17bd0e39..6bc927a9 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -69,6 +69,8 @@ namespace v2rayN.ViewModels public ComboItem SelectedServer { get; set; } [Reactive] public string ServerFilter { get; set; } + [Reactive] + public bool BlServers { get; set; } #endregion #region Menu @@ -787,9 +789,11 @@ namespace v2rayN.ViewModels _servers.Clear(); if (_lstProfile.Count > _config.guiItem.trayMenuServersLimit) { + BlServers = false; return; } + BlServers = true; for (int k = 0; k < _lstProfile.Count; k++) { ProfileItem it = _lstProfile[k]; diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml b/v2rayN/v2rayN/Views/MainWindow.xaml index c0d96e68..92ec420b 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml +++ b/v2rayN/v2rayN/Views/MainWindow.xaml @@ -833,17 +833,17 @@ + Height="Auto" + Background="{DynamicResource MaterialDesignLightBackground}" + BorderBrush="{DynamicResource MaterialDesignDarkBackground}" + BorderThickness="1"> + VerticalAlignment="Center" + Foreground="{DynamicResource MaterialDesignDarkBackground}" + Text="{Binding Mode=OneWay, Path=ToolTipText}" /> diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayN/v2rayN/Views/MainWindow.xaml.cs index f477c5fd..cdd4cf80 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -150,6 +150,7 @@ namespace v2rayN.Views this.OneWayBind(ViewModel, vm => vm.Servers, v => v.cmbServers.ItemsSource).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedServer, v => v.cmbServers.SelectedItem).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.BlServers, v => v.cmbServers.Visibility).DisposeWith(disposables); //tray menu this.BindCommand(ViewModel, vm => vm.AddServerViaClipboardCmd, v => v.menuAddServerViaClipboard2).DisposeWith(disposables); From 8ff248aa629f2644602c52463329c323757a97bb Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 5 Mar 2023 20:04:31 +0800 Subject: [PATCH 08/18] bug fixes --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 55ffed3f..f817b746 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -671,10 +671,6 @@ namespace v2rayN.Handler { profileItem.streamSecurity = Global.StreamSecurity; } - if (Utils.IsNullOrEmpty(profileItem.allowInsecure)) - { - profileItem.allowInsecure = config.coreBasicItem.defAllowInsecure.ToString().ToLower(); - } AddServerCommon(ref config, profileItem); @@ -827,10 +823,19 @@ namespace v2rayN.Handler public static int AddServerCommon(ref Config config, ProfileItem profileItem) { profileItem.configVersion = 2; - if (Utils.IsNullOrEmpty(profileItem.allowInsecure)) + + if (!Utils.IsNullOrEmpty(profileItem.streamSecurity)) { - profileItem.allowInsecure = config.coreBasicItem.defAllowInsecure.ToString().ToLower(); + if (Utils.IsNullOrEmpty(profileItem.allowInsecure)) + { + profileItem.allowInsecure = config.coreBasicItem.defAllowInsecure.ToString().ToLower(); + } + if (Utils.IsNullOrEmpty(profileItem.fingerprint)) + { + profileItem.fingerprint = config.coreBasicItem.defFingerprint.ToString().ToLower(); + } } + if (!Utils.IsNullOrEmpty(profileItem.network) && !Global.networks.Contains(profileItem.network)) { profileItem.network = Global.DefaultNetwork; From 5a04911c7c9fed31ae3ef4950ecf42b63f7e2c87 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 5 Mar 2023 20:05:39 +0800 Subject: [PATCH 09/18] fix resx --- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 2 +- v2rayN/v2rayN/Resx/ResUI.resx | 2 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 925fcf87..5764b679 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -1384,7 +1384,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the address (Url) 的本地化字符串。 + /// 查找类似 Please fill in the Url 的本地化字符串。 /// public static string MsgNeedUrl { get { diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index d4b2f75a..c6eb3357 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -380,7 +380,7 @@ Count - Please fill in the address (Url) + Please fill in the Url Do you want to append rules? Choose yes to append, choose otherwise to replace diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 7b64e94c..08f0ab75 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -304,7 +304,7 @@ 操作失败,请检查重试 - 请填写备注 + 请填写别名 请选择加密方式 @@ -380,7 +380,7 @@ 数量 - 请填写地址(Url) + 请填写Url 是否追加规则?选择是则追加,选择否则替换 From 5f364b48c9bf47a7a8de191b71fdd7e4860bfbb1 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 5 Mar 2023 20:08:48 +0800 Subject: [PATCH 10/18] Enable themes for Windows common controls and dialogs --- v2rayN/v2rayN/app.manifest | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/v2rayN/v2rayN/app.manifest b/v2rayN/v2rayN/app.manifest index c7239fd8..1246cc30 100644 --- a/v2rayN/v2rayN/app.manifest +++ b/v2rayN/v2rayN/app.manifest @@ -6,4 +6,18 @@ PerMonitorV2 + + + + + + + \ No newline at end of file From 961bd6140c62612717a847319d71dc16ca9ee049 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 6 Mar 2023 20:08:21 +0800 Subject: [PATCH 11/18] bug fixes --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index f817b746..c35024b2 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -832,7 +832,7 @@ namespace v2rayN.Handler } if (Utils.IsNullOrEmpty(profileItem.fingerprint)) { - profileItem.fingerprint = config.coreBasicItem.defFingerprint.ToString().ToLower(); + profileItem.fingerprint = config.coreBasicItem.defFingerprint; } } From a883ba8808b701a3d1861e85eeffa29cfabf6c13 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 7 Mar 2023 20:24:26 +0800 Subject: [PATCH 12/18] Optimize add and delete performance --- v2rayN/v2rayN/Base/SqliteHelper.cs | 11 ++- v2rayN/v2rayN/Handler/ConfigHandler.cs | 92 +++++++++---------- .../v2rayN/ViewModels/MainWindowViewModel.cs | 31 ++++--- 3 files changed, 73 insertions(+), 61 deletions(-) diff --git a/v2rayN/v2rayN/Base/SqliteHelper.cs b/v2rayN/v2rayN/Base/SqliteHelper.cs index 60c60811..c4250afa 100644 --- a/v2rayN/v2rayN/Base/SqliteHelper.cs +++ b/v2rayN/v2rayN/Base/SqliteHelper.cs @@ -25,11 +25,18 @@ namespace v2rayN.Base return _db.CreateTable(); } - public int Add(object model) + public int Insert(object model) { return _db.Insert(model); } - public async Task AddAsync(object model) + public int InsertAll(IEnumerable models) + { + lock (objLock) + { + return _db.InsertAll(models); + } + } + public async Task InsertAsync(object model) { return await _dbAsync.InsertAsync(model); } diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index c35024b2..7dac6126 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -352,7 +352,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddServer(ref Config config, ProfileItem profileItem) + public static int AddServer(ref Config config, ProfileItem profileItem, bool toFile = true) { profileItem.configType = EConfigType.VMess; @@ -370,7 +370,7 @@ namespace v2rayN.Handler return -1; } - AddServerCommon(ref config, profileItem); + AddServerCommon(ref config, profileItem, toFile); return 0; } @@ -383,11 +383,15 @@ namespace v2rayN.Handler /// public static int RemoveServer(Config config, List indexs) { + var subid = "TempRemoveSubId"; foreach (var item in indexs) { - RemoveProfileItem(config, item.indexId); + item.subid = subid; } + SqliteHelper.Instance.UpdateAll(indexs); + RemoveServerViaSubid(ref config, subid, false); + return 0; } @@ -414,7 +418,7 @@ namespace v2rayN.Handler } else { - AddServerCommon(ref config, profileItem); + AddServerCommon(ref config, profileItem, true); } } @@ -447,8 +451,7 @@ namespace v2rayN.Handler { return 0; } - var allItems = LazyConfig.Instance.ProfileItemIndexs(""); - if (allItems.Where(t => t == config.indexId).Any()) + if (SqliteHelper.Instance.Table().Where(t => t.indexId == config.indexId).Any()) { return 0; } @@ -456,11 +459,7 @@ namespace v2rayN.Handler { return SetDefaultServerIndex(ref config, lstProfile[0].indexId); } - if (allItems.Count > 0) - { - return SetDefaultServerIndex(ref config, allItems.FirstOrDefault()); - } - return -1; + return SetDefaultServerIndex(ref config, SqliteHelper.Instance.Table().Select(t => t.indexId).FirstOrDefault()); } public static ProfileItem? GetDefaultServer(ref Config config) { @@ -588,7 +587,7 @@ namespace v2rayN.Handler } - AddServerCommon(ref config, profileItem); + AddServerCommon(ref config, profileItem, true); return 0; @@ -620,7 +619,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddShadowsocksServer(ref Config config, ProfileItem profileItem) + public static int AddShadowsocksServer(ref Config config, ProfileItem profileItem, bool toFile = true) { profileItem.configType = EConfigType.Shadowsocks; @@ -633,7 +632,7 @@ namespace v2rayN.Handler return -1; } - AddServerCommon(ref config, profileItem); + AddServerCommon(ref config, profileItem, toFile); return 0; } @@ -644,13 +643,13 @@ namespace v2rayN.Handler /// /// /// - public static int AddSocksServer(ref Config config, ProfileItem profileItem) + public static int AddSocksServer(ref Config config, ProfileItem profileItem, bool toFile = true) { profileItem.configType = EConfigType.Socks; profileItem.address = profileItem.address.TrimEx(); - AddServerCommon(ref config, profileItem); + AddServerCommon(ref config, profileItem, toFile); return 0; } @@ -661,7 +660,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddTrojanServer(ref Config config, ProfileItem profileItem) + public static int AddTrojanServer(ref Config config, ProfileItem profileItem, bool toFile = true) { profileItem.configType = EConfigType.Trojan; @@ -672,7 +671,7 @@ namespace v2rayN.Handler profileItem.streamSecurity = Global.StreamSecurity; } - AddServerCommon(ref config, profileItem); + AddServerCommon(ref config, profileItem, toFile); return 0; } @@ -777,7 +776,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddVlessServer(ref Config config, ProfileItem profileItem) + public static int AddVlessServer(ref Config config, ProfileItem profileItem, bool toFile = true) { profileItem.configType = EConfigType.VLESS; @@ -790,7 +789,7 @@ namespace v2rayN.Handler profileItem.path = profileItem.path.TrimEx(); profileItem.streamSecurity = profileItem.streamSecurity.TrimEx(); - AddServerCommon(ref config, profileItem); + AddServerCommon(ref config, profileItem, toFile); return 0; } @@ -800,27 +799,27 @@ namespace v2rayN.Handler List source = lstProfile; bool keepOlder = config.guiItem.keepOlderDedupl; - List list = new(); + List lstKeep = new(); + List lstRemove = new(); if (!keepOlder) source.Reverse(); // Remove the early items first foreach (ProfileItem item in source) { - if (!list.Exists(i => CompareProfileItem(i, item, false))) + if (!lstKeep.Exists(i => CompareProfileItem(i, item, false))) { - list.Add(item); + lstKeep.Add(item); } else { - RemoveProfileItem(config, item.indexId); + lstRemove.Add(item); } } - //if (!keepOlder) list.Reverse(); - //config.vmess = list; + RemoveServer(config, lstRemove); - return list.Count; + return lstKeep.Count; } - public static int AddServerCommon(ref Config config, ProfileItem profileItem) + public static int AddServerCommon(ref Config config, ProfileItem profileItem, bool toFile = true) { profileItem.configVersion = 2; @@ -847,18 +846,12 @@ namespace v2rayN.Handler var maxSort = ProfileExHandler.Instance.GetMaxSort(); ProfileExHandler.Instance.SetSort(profileItem.indexId, maxSort + 1); } - else if (profileItem.indexId == config.indexId) - { - } - if (SqliteHelper.Instance.Replace(profileItem) > 0) + if (toFile) { - return 0; - } - else - { - return -1; + SqliteHelper.Instance.Replace(profileItem); } + return 0; } private static bool CompareProfileItem(ProfileItem o, ProfileItem n, bool remarks) @@ -935,11 +928,7 @@ namespace v2rayN.Handler } int countServers = 0; - //var maxSort = 0; - //if (SqliteHelper.Instance.Table().Count() > 0) - //{ - // maxSort = SqliteHelper.Instance.Table().Max(t => t.sort); - //} + List lstAdd = new(); string[] arrData = clipboardData.Split(Environment.NewLine.ToCharArray()); foreach (string str in arrData) { @@ -977,45 +966,47 @@ namespace v2rayN.Handler } profileItem.subid = subid; profileItem.isSub = isSub; - //profileItem.sort = maxSort + countServers + 1; if (profileItem.configType == EConfigType.VMess) { - if (AddServer(ref config, profileItem) == 0) + if (AddServer(ref config, profileItem, false) == 0) { countServers++; } } else if (profileItem.configType == EConfigType.Shadowsocks) { - if (AddShadowsocksServer(ref config, profileItem) == 0) + if (AddShadowsocksServer(ref config, profileItem, false) == 0) { countServers++; } } else if (profileItem.configType == EConfigType.Socks) { - if (AddSocksServer(ref config, profileItem) == 0) + if (AddSocksServer(ref config, profileItem, false) == 0) { countServers++; } } else if (profileItem.configType == EConfigType.Trojan) { - if (AddTrojanServer(ref config, profileItem) == 0) + if (AddTrojanServer(ref config, profileItem, false) == 0) { countServers++; } } else if (profileItem.configType == EConfigType.VLESS) { - if (AddVlessServer(ref config, profileItem) == 0) + if (AddVlessServer(ref config, profileItem, false) == 0) { countServers++; } } + lstAdd.Add(profileItem); } + SqliteHelper.Instance.InsertAll(lstAdd); + ToJsonFile(config); return countServers; } @@ -1265,6 +1256,7 @@ namespace v2rayN.Handler { return -1; } + var customProfile = SqliteHelper.Instance.Table().Where(t => t.subid == subid && t.configType == EConfigType.Custom).ToList(); if (isSub) { SqliteHelper.Instance.Execute($"delete from ProfileItem where isSub = 1 and subid = '{subid}'"); @@ -1273,6 +1265,10 @@ namespace v2rayN.Handler { SqliteHelper.Instance.Execute($"delete from ProfileItem where subid = '{subid}'"); } + foreach (var item in customProfile) + { + File.Delete(Utils.GetConfigPath(item.address)); + } return 0; } diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index 6bc927a9..734ab89b 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -741,6 +741,7 @@ namespace v2rayN.ViewModels security = t.security, network = t.network, streamSecurity = t.streamSecurity, + subid = t.subid, subRemarks = t.subRemarks, isActive = t.indexId == _config.indexId, sort = t33 == null ? 0 : t33.sort, @@ -830,21 +831,29 @@ namespace v2rayN.ViewModels #endregion #region Add Servers - private int GetProfileItems(out List lstSelecteds) + private int GetProfileItems(out List lstSelecteds, bool latest) { lstSelecteds = new List(); if (SelectedProfiles == null || SelectedProfiles.Count <= 0) { return -1; } - foreach (var profile in SelectedProfiles) + if (latest) { - var item = LazyConfig.Instance.GetProfileItem(profile.indexId); - if (item is not null) + foreach (var profile in SelectedProfiles) { - lstSelecteds.Add(item); + var item = LazyConfig.Instance.GetProfileItem(profile.indexId); + if (item is not null) + { + lstSelecteds.Add(item); + } } } + else + { + lstSelecteds = Utils.FromJson>(Utils.ToJson(SelectedProfiles)); + } + return 0; } @@ -931,7 +940,7 @@ namespace v2rayN.ViewModels } public void RemoveServer() { - if (GetProfileItems(out List lstSelecteds) < 0) + if (GetProfileItems(out List lstSelecteds, false) < 0) { return; } @@ -962,7 +971,7 @@ namespace v2rayN.ViewModels } private void CopyServer() { - if (GetProfileItems(out List lstSelecteds) < 0) + if (GetProfileItems(out List lstSelecteds, true) < 0) { return; } @@ -1094,7 +1103,7 @@ namespace v2rayN.ViewModels return; } - if (GetProfileItems(out List lstSelecteds) < 0) + if (GetProfileItems(out List lstSelecteds, false) < 0) { return; } @@ -1145,7 +1154,7 @@ namespace v2rayN.ViewModels { SelectedProfiles = _profileItems; } - if (GetProfileItems(out List lstSelecteds) < 0) + if (GetProfileItems(out List lstSelecteds, false) < 0) { return; } @@ -1177,7 +1186,7 @@ namespace v2rayN.ViewModels public void Export2ShareUrl() { - if (GetProfileItems(out List lstSelecteds) < 0) + if (GetProfileItems(out List lstSelecteds, true) < 0) { return; } @@ -1202,7 +1211,7 @@ namespace v2rayN.ViewModels private void Export2SubContent() { - if (GetProfileItems(out List lstSelecteds) < 0) + if (GetProfileItems(out List lstSelecteds, true) < 0) { return; } From 4ff1dc298258f4ec5908439a7230e2c2a96b8e5d Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Tue, 7 Mar 2023 20:24:51 +0800 Subject: [PATCH 13/18] code cleanup --- v2rayN/v2rayN/Handler/HotkeyHandler.cs | 18 +++++++++--------- v2rayN/v2rayN/Handler/MainFormHandler.cs | 1 - .../Views/GlobalHotkeySettingWindow.xaml.cs | 18 ++++++++---------- v2rayN/v2rayN/Views/MainWindow.xaml.cs | 4 ++-- v2rayN/v2rayN/Views/MsgView.xaml | 1 + 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/v2rayN/v2rayN/Handler/HotkeyHandler.cs b/v2rayN/v2rayN/Handler/HotkeyHandler.cs index 57944dab..a4724571 100644 --- a/v2rayN/v2rayN/Handler/HotkeyHandler.cs +++ b/v2rayN/v2rayN/Handler/HotkeyHandler.cs @@ -26,7 +26,7 @@ namespace v2rayN.Handler public event Action? HotkeyTriggerEvent; public HotkeyHandler() { - _hotkeyTriggerDic = new(); + _hotkeyTriggerDic = new(); ComponentDispatcher.ThreadPreprocessMessage += OnThreadPreProcessMessage; Init(); } @@ -35,7 +35,7 @@ namespace v2rayN.Handler { _hotkeyTriggerDic.Clear(); if (_config.globalHotkeys == null) return; - foreach(var item in _config.globalHotkeys) + foreach (var item in _config.globalHotkeys) { if (item.KeyCode != null && item.KeyCode != Key.None) { @@ -47,7 +47,7 @@ namespace v2rayN.Handler key = (key << 16) | (int)modifiers; if (!_hotkeyTriggerDic.ContainsKey(key)) { - _hotkeyTriggerDic.Add(key, new() { item.eGlobalHotkey }); + _hotkeyTriggerDic.Add(key, new() { item.eGlobalHotkey }); } else { @@ -59,7 +59,7 @@ namespace v2rayN.Handler } public void Load() { - foreach(var _hotkeyCode in _hotkeyTriggerDic.Keys) + foreach (var _hotkeyCode in _hotkeyTriggerDic.Keys) { var hotkeyInfo = GetHotkeyInfo(_hotkeyCode); bool isSuccess = false; @@ -67,7 +67,7 @@ namespace v2rayN.Handler Application.Current.Dispatcher.Invoke(() => { - isSuccess = RegisterHotKey(IntPtr.Zero, _hotkeyCode, hotkeyInfo.fsModifiers, hotkeyInfo.vKey); + isSuccess = RegisterHotKey(IntPtr.Zero, _hotkeyCode, hotkeyInfo.fsModifiers, hotkeyInfo.vKey); }); foreach (var name in hotkeyInfo.Names) { @@ -82,13 +82,13 @@ namespace v2rayN.Handler } UpdateViewEvent?.Invoke(false, msg); } - + } } public void ReLoad() { - foreach(var hotkey in _hotkeyTriggerDic.Keys) + foreach (var hotkey in _hotkeyTriggerDic.Keys) { Application.Current.Dispatcher.Invoke(() => { @@ -122,8 +122,8 @@ namespace v2rayN.Handler } private void OnThreadPreProcessMessage(ref MSG msg, ref bool handled) { - if (msg.message != WmHotkey|| !_hotkeyTriggerDic.ContainsKey((int)msg.lParam)) - { + if (msg.message != WmHotkey || !_hotkeyTriggerDic.ContainsKey((int)msg.lParam)) + { return; } handled = true; diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 6f3a47b8..1e96bd8f 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -2,7 +2,6 @@ using System.Drawing; using System.IO; using System.Windows.Forms; -using System.Windows.Input; using System.Windows.Media.Imaging; using v2rayN.Mode; using v2rayN.Resx; diff --git a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs index c067a562..830adcb3 100644 --- a/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/GlobalHotkeySettingWindow.xaml.cs @@ -1,6 +1,4 @@ -using Microsoft.Win32.TaskScheduler; -using System.Diagnostics; -using System.Text; +using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -21,7 +19,7 @@ namespace v2rayN.Views this.Owner = Application.Current.MainWindow; _config = LazyConfig.Instance.GetConfig(); _config.globalHotkeys ??= new List(); - + txtGlobalHotkey0.KeyDown += TxtGlobalHotkey_KeyDown; txtGlobalHotkey1.KeyDown += TxtGlobalHotkey_KeyDown; txtGlobalHotkey2.KeyDown += TxtGlobalHotkey_KeyDown; @@ -29,7 +27,7 @@ namespace v2rayN.Views txtGlobalHotkey4.KeyDown += TxtGlobalHotkey_KeyDown; HotkeyHandler.Instance.IsPause = true; - this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false; + this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false; Utils.SetDarkBorder(this, _config.uiItem.colorModeDark); InitData(); } @@ -60,7 +58,7 @@ namespace v2rayN.Views (sender as TextBox)!.Text = KeyEventItemToString(_TextBoxKeyEventItem[sender]); } - private KeyEventItem GetKeyEventItemByEGlobalHotkey(List KELsit,EGlobalHotkey eg) + private KeyEventItem GetKeyEventItemByEGlobalHotkey(List KELsit, EGlobalHotkey eg) { return Utils.DeepCopy(KELsit.Find((it) => it.eGlobalHotkey == eg) ?? new() { @@ -79,14 +77,14 @@ namespace v2rayN.Views if (item.Control) res.Append($"{ModifierKeys.Control}+"); if (item.Shift) res.Append($"{ModifierKeys.Shift}+"); if (item.Alt) res.Append($"{ModifierKeys.Alt}+"); - if(item.KeyCode != null && item.KeyCode != Key.None) + if (item.KeyCode != null && item.KeyCode != Key.None) res.Append($"{item.KeyCode}"); return res.ToString(); } private void BindingData() { - foreach(var item in _TextBoxKeyEventItem) + foreach (var item in _TextBoxKeyEventItem) { if (item.Value.KeyCode != null && item.Value.KeyCode != Key.None) { @@ -121,10 +119,10 @@ namespace v2rayN.Views private void btnReset_Click(object sender, RoutedEventArgs e) { - foreach(var k in _TextBoxKeyEventItem.Keys) + foreach (var k in _TextBoxKeyEventItem.Keys) { _TextBoxKeyEventItem[k].Alt = false; - _TextBoxKeyEventItem[k].Control= false; + _TextBoxKeyEventItem[k].Control = false; _TextBoxKeyEventItem[k].Shift = false; _TextBoxKeyEventItem[k].KeyCode = Key.None; } diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayN/v2rayN/Views/MainWindow.xaml.cs index cdd4cf80..3cc634e7 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -150,7 +150,7 @@ namespace v2rayN.Views this.OneWayBind(ViewModel, vm => vm.Servers, v => v.cmbServers.ItemsSource).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedServer, v => v.cmbServers.SelectedItem).DisposeWith(disposables); - this.OneWayBind(ViewModel, vm => vm.BlServers, v => v.cmbServers.Visibility).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.BlServers, v => v.cmbServers.Visibility).DisposeWith(disposables); //tray menu this.BindCommand(ViewModel, vm => vm.AddServerViaClipboardCmd, v => v.menuAddServerViaClipboard2).DisposeWith(disposables); @@ -192,7 +192,7 @@ namespace v2rayN.Views this.Title = $"{Utils.GetVersion()} - {(IsAdministrator ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}"; spEnableTun.Visibility = IsAdministrator ? Visibility.Visible : Visibility.Collapsed; - + if (_config.uiItem.autoHideStartup) { WindowState = WindowState.Minimized; diff --git a/v2rayN/v2rayN/Views/MsgView.xaml b/v2rayN/v2rayN/Views/MsgView.xaml index af464d31..3a413c7b 100644 --- a/v2rayN/v2rayN/Views/MsgView.xaml +++ b/v2rayN/v2rayN/Views/MsgView.xaml @@ -48,6 +48,7 @@ FontSize="{DynamicResource StdFontSizeMsg}" HorizontalScrollBarVisibility="Auto" IsReadOnly="True" + IsReadOnlyCaretVisible="True" TextAlignment="Left" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible"> From 6f181053b2e9ee40634b4c0562be3807139d4d22 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 8 Mar 2023 20:39:50 +0800 Subject: [PATCH 14/18] Optimize --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 8 ++++++- v2rayN/v2rayN/Handler/LazyConfig.cs | 2 +- .../v2rayN/ViewModels/MainWindowViewModel.cs | 23 +++++++++++++------ v2rayN/v2rayN/Views/MainWindow.xaml | 2 +- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 7dac6126..1e15824a 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -403,8 +403,14 @@ namespace v2rayN.Handler /// public static int CopyServer(ref Config config, List indexs) { - foreach (var item in indexs) + foreach (var it in indexs) { + var item = LazyConfig.Instance.GetProfileItem(it.indexId); + if (item is null) + { + continue; + } + ProfileItem profileItem = Utils.DeepCopy(item); profileItem.indexId = string.Empty; profileItem.remarks = $"{item.remarks}-clone"; diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index ed915c24..9a2a3ec1 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -112,7 +112,7 @@ namespace v2rayN.Handler { filter = filter.Replace("'", ""); } - sql += $" and a.remarks like '%{filter}%'"; + sql += String.Format(" and (a.remarks like '%{0}%' or a.address like '%{0}%') ", filter); } return SqliteHelper.Instance.Query(sql).ToList(); diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index 734ab89b..a6edad19 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -700,7 +700,7 @@ namespace v2rayN.ViewModels _subId = SelectedSub?.id; _config.subIndexId = _subId; - RefreshServers(); + RefreshServers(false); _updateView("ProfilesFocus"); } @@ -715,11 +715,13 @@ namespace v2rayN.ViewModels RefreshServers(); } - private void RefreshServers() + private void RefreshServers(bool blCheckDefault = true) { List lstModel = LazyConfig.Instance.ProfileItems(_subId, _serverFilter); - ConfigHandler.SetDefaultServer(_config, lstModel); - + if (blCheckDefault) + { + ConfigHandler.SetDefaultServer(_config, lstModel); + } List lstServerStat = new(); if (_statistics != null && _statistics.Enable) { @@ -782,6 +784,11 @@ namespace v2rayN.ViewModels RunningServerDisplay = $"{ResUI.menuServers}:{runningSummary}"; RunningServerToolTipText = runningSummary; } + else + { + RunningServerDisplay = + RunningServerToolTipText = ResUI.CheckServerSettings; + } })); } @@ -838,9 +845,11 @@ namespace v2rayN.ViewModels { return -1; } + + var orderProfiles = SelectedProfiles?.OrderBy(t => t.sort); if (latest) { - foreach (var profile in SelectedProfiles) + foreach (var profile in orderProfiles) { var item = LazyConfig.Instance.GetProfileItem(profile.indexId); if (item is not null) @@ -851,7 +860,7 @@ namespace v2rayN.ViewModels } else { - lstSelecteds = Utils.FromJson>(Utils.ToJson(SelectedProfiles)); + lstSelecteds = Utils.FromJson>(Utils.ToJson(orderProfiles)); } return 0; @@ -971,7 +980,7 @@ namespace v2rayN.ViewModels } private void CopyServer() { - if (GetProfileItems(out List lstSelecteds, true) < 0) + if (GetProfileItems(out List lstSelecteds, false) < 0) { return; } diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml b/v2rayN/v2rayN/Views/MainWindow.xaml index 92ec420b..c54166b1 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml +++ b/v2rayN/v2rayN/Views/MainWindow.xaml @@ -617,7 +617,7 @@ - + Date: Thu, 9 Mar 2023 20:57:12 +0800 Subject: [PATCH 15/18] Add reality and remove legacy xtls settings --- v2rayN/v2rayN/Global.cs | 4 +- v2rayN/v2rayN/Handler/CoreConfigHandler.cs | 50 ++---- v2rayN/v2rayN/Mode/ProfileItem.cs | 104 +++---------- v2rayN/v2rayN/Mode/V2rayConfig.cs | 13 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 27 ++++ v2rayN/v2rayN/Resx/ResUI.resx | 9 ++ v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 11 +- .../v2rayN/ViewModels/AddServerViewModel.cs | 4 + v2rayN/v2rayN/Views/AddServerWindow.xaml | 143 +++++++++++++++--- v2rayN/v2rayN/Views/AddServerWindow.xaml.cs | 26 +++- 10 files changed, 241 insertions(+), 150 deletions(-) diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 93f07339..1edbe712 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -43,7 +43,7 @@ public const string directTag = "direct"; public const string blockTag = "block"; public const string StreamSecurity = "tls"; - public const string StreamSecurityX = "xtls"; + public const string StreamSecurityReality = "reality"; public const string InboundSocks = "socks"; public const string InboundHttp = "http"; public const string InboundSocks2 = "socks2"; @@ -92,7 +92,7 @@ public static readonly List ssSecuritys = new() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; public static readonly List ssSecuritysInSagerNet = new() { "none", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "aes-128-gcm", "aes-192-gcm", "aes-256-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "rc4", "rc4-md5", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-cfb8", "aes-192-cfb8", "aes-256-cfb8", "aes-128-ofb", "aes-192-ofb", "aes-256-ofb", "bf-cfb", "cast5-cfb", "des-cfb", "idea-cfb", "rc2-cfb", "seed-cfb", "camellia-128-cfb", "camellia-192-cfb", "camellia-256-cfb", "camellia-128-cfb8", "camellia-192-cfb8", "camellia-256-cfb8", "salsa20", "chacha20", "chacha20-ietf", "xchacha20" }; public static readonly List ssSecuritysInXray = new() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "none", "plain", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305" }; - public static readonly List xtlsFlows = new() { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443", "xtls-rprx-vision", "xtls-rprx-vision-udp443" }; + public static readonly List flows = new() { "", "xtls-rprx-vision", "xtls-rprx-vision-udp443" }; public static readonly List networks = new() { "tcp", "kcp", "ws", "h2", "quic", "grpc" }; public static readonly List kcpHeaderTypes = new() { "srtp", "utp", "wechat-video", "dtls", "wireguard" }; public static readonly List coreTypes = new() { "v2fly", "SagerNet", "Xray", "v2fly_v5" }; diff --git a/v2rayN/v2rayN/Handler/CoreConfigHandler.cs b/v2rayN/v2rayN/Handler/CoreConfigHandler.cs index 4b5bc51e..2a5fcca5 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigHandler.cs @@ -456,16 +456,15 @@ namespace v2rayN.Handler boundStreamSettings(node, "out", outbound.streamSettings); - //if xtls - if (node.streamSecurity == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityReality) { if (Utils.IsNullOrEmpty(node.flow)) { - usersItem.flow = Global.xtlsFlows[1]; + usersItem.flow = Global.flows[1]; } else { - usersItem.flow = node.flow.Replace("splice", "direct"); + usersItem.flow = node.flow; } outbound.mux.enabled = false; @@ -503,23 +502,7 @@ namespace v2rayN.Handler serversItem.flow = string.Empty; serversItem.ota = false; - serversItem.level = 1; - - //if xtls - if (node.streamSecurity == Global.StreamSecurityX) - { - if (Utils.IsNullOrEmpty(node.flow)) - { - serversItem.flow = Global.xtlsFlows[1]; - } - else - { - serversItem.flow = node.flow.Replace("splice", "direct"); - } - - outbound.mux.enabled = false; - outbound.mux.concurrency = -1; - } + serversItem.level = 1; outbound.mux.enabled = false; outbound.mux.concurrency = -1; @@ -581,26 +564,21 @@ namespace v2rayN.Handler streamSettings.tlsSettings = tlsSettings; } - //if xtls - if (node.streamSecurity == Global.StreamSecurityX) + //if Reality + if (node.streamSecurity == Global.StreamSecurityReality) { streamSettings.security = node.streamSecurity; - TlsSettings xtlsSettings = new() + RealitySettings realitySettings = new() { - allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure), - alpn = node.GetAlpn(), - fingerprint = node.fingerprint.IsNullOrEmpty() ? config.coreBasicItem.defFingerprint : node.fingerprint + fingerprint = node.fingerprint.IsNullOrEmpty() ? config.coreBasicItem.defFingerprint : node.fingerprint, + serverName = sni, + publicKey = node.publicKey, + shortId = node.shortId, + spiderX = node.spiderX, }; - if (!string.IsNullOrWhiteSpace(sni)) - { - xtlsSettings.serverName = sni; - } - else if (!string.IsNullOrWhiteSpace(host)) - { - xtlsSettings.serverName = Utils.String2List(host)[0]; - } - streamSettings.xtlsSettings = xtlsSettings; + + streamSettings.realitySettings = realitySettings; } //streamSettings diff --git a/v2rayN/v2rayN/Mode/ProfileItem.cs b/v2rayN/v2rayN/Mode/ProfileItem.cs index f043dc4f..c26712a2 100644 --- a/v2rayN/v2rayN/Mode/ProfileItem.cs +++ b/v2rayN/v2rayN/Mode/ProfileItem.cs @@ -85,158 +85,100 @@ namespace v2rayN.Mode #endregion [PrimaryKey] - public string indexId - { - get; set; - } + public string indexId { get; set; } /// /// config type(1=normal,2=custom) /// - public EConfigType configType - { - get; set; - } - + public EConfigType configType { get; set; } /// /// 版本(现在=2) /// - public int configVersion - { - get; set; - } + public int configVersion { get; set; } /// /// 远程服务器地址 /// - public string address - { - get; set; - } + public string address { get; set; } /// /// 远程服务器端口 /// - public int port - { - get; set; - } + public int port { get; set; } /// /// 远程服务器ID /// - public string id - { - get; set; - } + public string id { get; set; } /// /// 远程服务器额外ID /// - public int alterId - { - get; set; - } + public int alterId { get; set; } /// /// 本地安全策略 /// - public string security - { - get; set; - } + public string security { get; set; } /// /// tcp,kcp,ws,h2,quic /// - public string network - { - get; set; - } + public string network { get; set; } /// /// 备注或别名 /// - public string remarks - { - get; set; - } + public string remarks { get; set; } /// /// 伪装类型 /// - public string headerType - { - get; set; - } + public string headerType { get; set; } /// /// 伪装的域名 /// - public string requestHost - { - get; set; - } + public string requestHost { get; set; } /// /// ws h2 path /// - public string path - { - get; set; - } + public string path { get; set; } /// /// 传输层安全 /// - public string streamSecurity - { - get; set; - } + public string streamSecurity { get; set; } /// /// 是否允许不安全连接(用于客户端) /// - public string allowInsecure - { - get; set; - } + public string allowInsecure { get; set; } /// /// SubItem id /// - public string subid - { - get; set; - } + public string subid { get; set; } public bool isSub { get; set; } = true; /// /// VLESS flow /// - public string flow - { - get; set; - } + public string flow { get; set; } /// /// tls sni /// - public string sni - { - get; set; - } + public string sni { get; set; } /// /// tls alpn /// public string alpn { get; set; } = string.Empty; - public ECoreType? coreType - { - get; set; - } + public ECoreType? coreType { get; set; } - public int preSocksPort - { - get; set; - } + public int preSocksPort { get; set; } public string fingerprint { get; set; } public bool displayLog { get; set; } = true; + public string publicKey { get; set; } + public string shortId { get; set; } + public string spiderX { get; set; } } } diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index ec1fd03b..f2181742 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -389,9 +389,9 @@ namespace v2rayN.Mode public QuicSettings quicSettings { get; set; } /// - /// VLESS xtls + /// VLESS only /// - public TlsSettings xtlsSettings { get; set; } + public RealitySettings realitySettings { get; set; } /// /// grpc /// @@ -424,6 +424,15 @@ namespace v2rayN.Mode public string fingerprint { get; set; } } + public class RealitySettings + { + public bool show { get; set; } = false; + public string fingerprint { get; set; } + public string serverName { get; set; } + public string publicKey { get; set; } + public string shortId { get; set; } + public string spiderX { get; set; } + } public class TcpSettings { diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 5764b679..3de5ca6e 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -2167,6 +2167,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 PublicKey 的本地化字符串。 + /// + public static string TbPublicKey { + get { + return ResourceManager.GetString("TbPublicKey", resourceCulture); + } + } + /// /// 查找类似 Alias (remarks) 的本地化字符串。 /// @@ -2896,6 +2905,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 ShortId 的本地化字符串。 + /// + public static string TbShortId { + get { + return ResourceManager.GetString("TbShortId", resourceCulture); + } + } + /// /// 查找类似 SNI 的本地化字符串。 /// @@ -2905,6 +2923,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 SpiderX 的本地化字符串。 + /// + public static string TbSpiderX { + get { + return ResourceManager.GetString("TbSpiderX", resourceCulture); + } + } + /// /// 查找类似 TLS 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index c6eb3357..fa7d6a43 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -1132,4 +1132,13 @@ Move up and down + + PublicKey + + + ShortId + + + SpiderX + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 08f0ab75..67798f3e 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -710,7 +710,7 @@ SNI - TLS + 传输层安全(TLS) *默认tcp,选错会无法连接 @@ -1132,4 +1132,13 @@ 移至上下 + + PublicKey + + + ShortId + + + SpiderX + \ No newline at end of file diff --git a/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs b/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs index d27c7db4..fbbdb478 100644 --- a/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/AddServerViewModel.cs @@ -118,6 +118,10 @@ namespace v2rayN.ViewModels item.allowInsecure = SelectedSource.allowInsecure; item.fingerprint = SelectedSource.fingerprint; item.alpn = SelectedSource.alpn; + + item.publicKey = SelectedSource.publicKey; + item.shortId = SelectedSource.shortId; + item.spiderX = SelectedSource.spiderX; } int ret = -1; diff --git a/v2rayN/v2rayN/Views/AddServerWindow.xaml b/v2rayN/v2rayN/Views/AddServerWindow.xaml index f772794e..991e62a0 100644 --- a/v2rayN/v2rayN/Views/AddServerWindow.xaml +++ b/v2rayN/v2rayN/Views/AddServerWindow.xaml @@ -11,7 +11,7 @@ xmlns:vms="clr-namespace:v2rayN.ViewModels" Title="{x:Static resx:ResUI.menuServers}" Width="800" - Height="800" + Height="830" x:TypeArguments="vms:AddServerViewModel" Background="{DynamicResource MaterialDesignPaper}" FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}" @@ -559,8 +559,10 @@ Margin="{StaticResource ServerItemMargin}" Style="{StaticResource DefComboBox}" /> - - + @@ -595,25 +597,10 @@ Margin="{StaticResource ServerItemMargin}" VerticalAlignment="Center" Style="{StaticResource ToolbarTextBlock}" - Text="{x:Static resx:ResUI.TbAllowInsecure}" /> - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { cmbFingerprint.Items.Add(it); + cmbFingerprint2.Items.Add(it); }); Global.allowInsecures.ForEach(it => { @@ -74,8 +75,8 @@ namespace v2rayN.Views break; case EConfigType.VLESS: gridVLESS.Visibility = Visibility.Visible; - cmbStreamSecurity.Items.Add(Global.StreamSecurityX); - Global.xtlsFlows.ForEach(it => + cmbStreamSecurity.Items.Add(Global.StreamSecurityReality); + Global.flows.ForEach(it => { cmbFlow5.Items.Add(it); }); @@ -86,8 +87,7 @@ namespace v2rayN.Views break; case EConfigType.Trojan: gridTrojan.Visibility = Visibility.Visible; - cmbStreamSecurity.Items.Add(Global.StreamSecurityX); - Global.xtlsFlows.ForEach(it => + Global.flows.ForEach(it => { cmbFlow6.Items.Add(it); }); @@ -138,6 +138,13 @@ namespace v2rayN.Views this.Bind(ViewModel, vm => vm.SelectedSource.allowInsecure, v => v.cmbAllowInsecure.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.fingerprint, v => v.cmbFingerprint.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.alpn, v => v.cmbAlpn.Text).DisposeWith(disposables); + //reality + this.Bind(ViewModel, vm => vm.SelectedSource.sni, v => v.txtSNI2.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.fingerprint, v => v.cmbFingerprint2.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.publicKey, v => v.txtPublicKey.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.shortId, v => v.txtShortId.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.spiderX, v => v.txtSpiderX.Text).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); @@ -159,13 +166,20 @@ namespace v2rayN.Views private void CmbStreamSecurity_SelectionChanged(object sender, SelectionChangedEventArgs e) { var security = cmbStreamSecurity.SelectedItem.ToString(); - if (Utils.IsNullOrEmpty(security)) + if (security == Global.StreamSecurityReality) { + gridRealityMore.Visibility = Visibility.Visible; gridTlsMore.Visibility = Visibility.Hidden; } + else if (security == Global.StreamSecurity) + { + gridRealityMore.Visibility = Visibility.Hidden; + gridTlsMore.Visibility = Visibility.Visible; + } else { - gridTlsMore.Visibility = Visibility.Visible; + gridRealityMore.Visibility = Visibility.Hidden; + gridTlsMore.Visibility = Visibility.Hidden; } } private void btnGUID_Click(object sender, RoutedEventArgs e) From 3f5729044fb28dab8324f2d8ca18e4f20cc7d436 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 9 Mar 2023 21:02:41 +0800 Subject: [PATCH 16/18] up 6.16 --- v2rayN/v2rayN/v2rayN.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 15d55633..1042af7c 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -10,18 +10,18 @@ enable v2rayN.ico Copyright © 2017-2023 (GPLv3) - 6.15 + 6.16 - + - + - + From 83efe66f3e3e445a65db2e315f22dbfbc8a82576 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 10 Mar 2023 11:25:34 +0800 Subject: [PATCH 17/18] bug fixes --- v2rayN/v2rayN/Handler/CoreConfigHandler.cs | 24 +++-------------- v2rayN/v2rayN/Mode/V2rayConfig.cs | 30 ++++++++-------------- 2 files changed, 13 insertions(+), 41 deletions(-) diff --git a/v2rayN/v2rayN/Handler/CoreConfigHandler.cs b/v2rayN/v2rayN/Handler/CoreConfigHandler.cs index 2a5fcca5..c710fb3f 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigHandler.cs @@ -458,14 +458,7 @@ namespace v2rayN.Handler if (node.streamSecurity == Global.StreamSecurityReality) { - if (Utils.IsNullOrEmpty(node.flow)) - { - usersItem.flow = Global.flows[1]; - } - else - { - usersItem.flow = node.flow; - } + usersItem.flow = node.flow; outbound.mux.enabled = false; outbound.mux.concurrency = -1; @@ -502,7 +495,7 @@ namespace v2rayN.Handler serversItem.flow = string.Empty; serversItem.ota = false; - serversItem.level = 1; + serversItem.level = 1; outbound.mux.enabled = false; outbound.mux.concurrency = -1; @@ -569,7 +562,7 @@ namespace v2rayN.Handler { streamSettings.security = node.streamSecurity; - RealitySettings realitySettings = new() + TlsSettings realitySettings = new() { fingerprint = node.fingerprint.IsNullOrEmpty() ? config.coreBasicItem.defFingerprint : node.fingerprint, serverName = sni, @@ -638,13 +631,6 @@ namespace v2rayN.Handler } streamSettings.wsSettings = wsSettings; - //TlsSettings tlsSettings = new TlsSettings(); - //tlsSettings.allowInsecure = config.allowInsecure(); - //if (!string.IsNullOrWhiteSpace(host)) - //{ - // tlsSettings.serverName = host; - //} - //streamSettings.tlsSettings = tlsSettings; break; //h2 case "h2": @@ -658,9 +644,6 @@ namespace v2rayN.Handler streamSettings.httpSettings = httpSettings; - //TlsSettings tlsSettings2 = new TlsSettings(); - //tlsSettings2.allowInsecure = config.allowInsecure(); - //streamSettings.tlsSettings = tlsSettings2; break; //quic case "quic": @@ -696,7 +679,6 @@ namespace v2rayN.Handler permit_without_stream = config.grpcItem.permit_without_stream, initial_windows_size = config.grpcItem.initial_windows_size, }; - streamSettings.grpcSettings = grpcSettings; break; default: diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index f2181742..d7436ca8 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -391,7 +391,7 @@ namespace v2rayN.Mode /// /// VLESS only /// - public RealitySettings realitySettings { get; set; } + public TlsSettings realitySettings { get; set; } /// /// grpc /// @@ -404,34 +404,24 @@ namespace v2rayN.Mode /// /// 是否允许不安全连接(用于客户端) /// - public bool allowInsecure { get; set; } + public bool? allowInsecure { get; set; } /// /// /// - public string serverName { get; set; } + public string? serverName { get; set; } /// /// /// - public List alpn - { - get; set; - } + public List? alpn { get; set; } - /// - /// "chrome" | "firefox" | "safari" | "randomized" - /// - public string fingerprint { get; set; } + public string? fingerprint { get; set; } + + public bool? show { get; set; } = false; + public string? publicKey { get; set; } + public string? shortId { get; set; } + public string? spiderX { get; set; } - } - public class RealitySettings - { - public bool show { get; set; } = false; - public string fingerprint { get; set; } - public string serverName { get; set; } - public string publicKey { get; set; } - public string shortId { get; set; } - public string spiderX { get; set; } } public class TcpSettings From 63f251d1fd98c472d39bd19085fef54b653bbaf0 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 10 Mar 2023 20:38:08 +0800 Subject: [PATCH 18/18] up 6.17 --- v2rayN/v2rayN/v2rayN.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 1042af7c..2007af72 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -10,12 +10,12 @@ enable v2rayN.ico Copyright © 2017-2023 (GPLv3) - 6.16 + 6.17 - +