mirror of
https://github.com/2dust/v2rayN.git
synced 2025-10-27 02:34:41 +00:00
Compare commits
2 commits
6079e76be5
...
a7f35d4495
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7f35d4495 | ||
|
|
add92cfa7c |
6 changed files with 226 additions and 136 deletions
|
|
@ -11,6 +11,7 @@
|
||||||
<PackageVersion Include="Avalonia.ReactiveUI" Version="11.2.4" />
|
<PackageVersion Include="Avalonia.ReactiveUI" Version="11.2.4" />
|
||||||
<PackageVersion Include="CliWrap" Version="3.8.0" />
|
<PackageVersion Include="CliWrap" Version="3.8.0" />
|
||||||
<PackageVersion Include="Downloader" Version="3.3.3" />
|
<PackageVersion Include="Downloader" Version="3.3.3" />
|
||||||
|
<PackageVersion Include="GlobalHotKeys.Windows" Version="0.1.0" />
|
||||||
<PackageVersion Include="H.NotifyIcon.Wpf" Version="2.2.0" />
|
<PackageVersion Include="H.NotifyIcon.Wpf" Version="2.2.0" />
|
||||||
<PackageVersion Include="MaterialDesignThemes" Version="5.2.1" />
|
<PackageVersion Include="MaterialDesignThemes" Version="5.2.1" />
|
||||||
<PackageVersion Include="MessageBox.Avalonia" Version="3.2.0" />
|
<PackageVersion Include="MessageBox.Avalonia" Version="3.2.0" />
|
||||||
|
|
|
||||||
88
v2rayN/v2rayN.Desktop/Handler/HotkeyHandler.cs
Normal file
88
v2rayN/v2rayN.Desktop/Handler/HotkeyHandler.cs
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
using System.Reactive.Linq;
|
||||||
|
using Avalonia.Input;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
using Avalonia.Win32.Input;
|
||||||
|
using GlobalHotKeys;
|
||||||
|
using GlobalHotKeys.Native.Types;
|
||||||
|
|
||||||
|
namespace v2rayN.Desktop.Handler
|
||||||
|
{
|
||||||
|
public sealed class HotkeyHandler
|
||||||
|
{
|
||||||
|
private static readonly Lazy<HotkeyHandler> _instance = new(() => new());
|
||||||
|
public static HotkeyHandler Instance = _instance.Value;
|
||||||
|
private readonly Dictionary<int, EGlobalHotkey> _hotkeyTriggerDic = new();
|
||||||
|
private HotKeyManager? _hotKeyManager;
|
||||||
|
|
||||||
|
private Config? _config;
|
||||||
|
|
||||||
|
private event Action<EGlobalHotkey>? _updateFunc;
|
||||||
|
|
||||||
|
public bool IsPause { get; set; } = false;
|
||||||
|
|
||||||
|
public void Init(Config config, Action<EGlobalHotkey> updateFunc)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
_updateFunc = updateFunc;
|
||||||
|
_hotKeyManager = new GlobalHotKeys.HotKeyManager();
|
||||||
|
|
||||||
|
Register();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_hotKeyManager?.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Register()
|
||||||
|
{
|
||||||
|
_hotkeyTriggerDic.Clear();
|
||||||
|
|
||||||
|
foreach (var item in _config.GlobalHotkeys)
|
||||||
|
{
|
||||||
|
if (item.KeyCode is null or 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var vKey = KeyInterop.VirtualKeyFromKey((Key)item.KeyCode);
|
||||||
|
var modifiers = Modifiers.NoRepeat;
|
||||||
|
if (item.Control)
|
||||||
|
{
|
||||||
|
modifiers |= Modifiers.Control;
|
||||||
|
}
|
||||||
|
if (item.Shift)
|
||||||
|
{
|
||||||
|
modifiers |= Modifiers.Shift;
|
||||||
|
}
|
||||||
|
if (item.Alt)
|
||||||
|
{
|
||||||
|
modifiers |= Modifiers.Alt;
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = _hotKeyManager?.Register((VirtualKeyCode)vKey, modifiers);
|
||||||
|
if (result?.IsSuccessful == true)
|
||||||
|
{
|
||||||
|
_hotkeyTriggerDic.Add(result.Id, item.EGlobalHotkey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_hotKeyManager?.HotKeyPressed
|
||||||
|
.ObserveOn(AvaloniaScheduler.Instance)
|
||||||
|
.Subscribe(OnNext);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnNext(HotKey key)
|
||||||
|
{
|
||||||
|
if (_updateFunc == null || IsPause)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_hotkeyTriggerDic.TryGetValue(key.Id, out var value))
|
||||||
|
{
|
||||||
|
_updateFunc?.Invoke(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,17 +6,17 @@
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
|
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
|
||||||
xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib"
|
xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib"
|
||||||
Title="{x:Static resx:ResUI.menuSetting}"
|
Title="{x:Static resx:ResUI.menuGlobalHotkeySetting}"
|
||||||
Width="700"
|
Width="700"
|
||||||
Height="500"
|
Height="500"
|
||||||
x:DataType="vms:SubEditViewModel"
|
x:DataType="vms:GlobalHotkeySettingViewModel"
|
||||||
ShowInTaskbar="False"
|
ShowInTaskbar="False"
|
||||||
WindowStartupLocation="CenterScreen"
|
WindowStartupLocation="CenterScreen"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
<DockPanel Margin="{StaticResource Margin8}">
|
<DockPanel Margin="{StaticResource Margin8}">
|
||||||
<StackPanel
|
<StackPanel
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
DockPanel.Dock="Bottom"
|
DockPanel.Dock="Bottom"
|
||||||
Orientation="Horizontal">
|
Orientation="Horizontal">
|
||||||
<Button
|
<Button
|
||||||
|
|
@ -55,77 +55,77 @@
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbDisplayGUI}" />
|
Text="{x:Static resx:ResUI.TbDisplayGUI}" />
|
||||||
|
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtGlobalHotkey0"
|
x:Name="txtGlobalHotkey0"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
IsReadOnly="True" />
|
IsReadOnly="True" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbClearSystemProxy}" />
|
Text="{x:Static resx:ResUI.TbClearSystemProxy}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtGlobalHotkey1"
|
x:Name="txtGlobalHotkey1"
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
IsReadOnly="True" />
|
IsReadOnly="True" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbSetSystemProxy}" />
|
Text="{x:Static resx:ResUI.TbSetSystemProxy}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtGlobalHotkey2"
|
x:Name="txtGlobalHotkey2"
|
||||||
Grid.Row="3"
|
Grid.Row="3"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
IsReadOnly="True" />
|
IsReadOnly="True" />
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbNotChangeSystemProxy}" />
|
Text="{x:Static resx:ResUI.TbNotChangeSystemProxy}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtGlobalHotkey3"
|
x:Name="txtGlobalHotkey3"
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
IsReadOnly="True" />
|
IsReadOnly="True" />
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbSystemProxyPac}" />
|
Text="{x:Static resx:ResUI.TbSystemProxyPac}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtGlobalHotkey4"
|
x:Name="txtGlobalHotkey4"
|
||||||
Grid.Row="5"
|
Grid.Row="5"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
IsReadOnly="True" />
|
IsReadOnly="True" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
VerticalAlignment="Center"
|
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbGlobalHotkeySettingTip}" />
|
Text="{x:Static resx:ResUI.TbGlobalHotkeySettingTip}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
|
||||||
|
|
@ -1,129 +1,138 @@
|
||||||
using Avalonia.Controls;
|
using System.Reactive.Disposables;
|
||||||
|
using System.Text;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Input;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.ReactiveUI;
|
||||||
|
using ReactiveUI;
|
||||||
|
using v2rayN.Desktop.Handler;
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Views
|
namespace v2rayN.Desktop.Views
|
||||||
{
|
{
|
||||||
public partial class GlobalHotkeySettingWindow : Window
|
public partial class GlobalHotkeySettingWindow : ReactiveWindow<GlobalHotkeySettingViewModel>
|
||||||
{
|
{
|
||||||
private static Config _config = default!;
|
private readonly List<object> _textBoxKeyEventItem = new();
|
||||||
private Dictionary<object, KeyEventItem> _TextBoxKeyEventItem = default!;
|
|
||||||
|
|
||||||
public GlobalHotkeySettingWindow()
|
public GlobalHotkeySettingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
ViewModel = new GlobalHotkeySettingViewModel(UpdateViewHandler);
|
||||||
|
|
||||||
|
btnReset.Click += btnReset_Click;
|
||||||
|
|
||||||
|
HotkeyHandler.Instance.IsPause = true;
|
||||||
|
this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false;
|
||||||
btnCancel.Click += (s, e) => this.Close();
|
btnCancel.Click += (s, e) => this.Close();
|
||||||
_config = AppHandler.Instance.Config;
|
|
||||||
//_config.globalHotkeys ??= new List<KeyEventItem>();
|
|
||||||
|
|
||||||
//txtGlobalHotkey0.KeyDown += TxtGlobalHotkey_PreviewKeyDown;
|
this.WhenActivated(disposables =>
|
||||||
//txtGlobalHotkey1.KeyDown += TxtGlobalHotkey_PreviewKeyDown;
|
{
|
||||||
//txtGlobalHotkey2.KeyDown += TxtGlobalHotkey_PreviewKeyDown;
|
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
||||||
//txtGlobalHotkey3.KeyDown += TxtGlobalHotkey_PreviewKeyDown;
|
});
|
||||||
//txtGlobalHotkey4.KeyDown += TxtGlobalHotkey_PreviewKeyDown;
|
|
||||||
|
|
||||||
//HotkeyHandler.Instance.IsPause = true;
|
Init();
|
||||||
//this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false;
|
BindingData();
|
||||||
//InitData();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//private void InitData()
|
private async Task<bool> UpdateViewHandler(EViewAction action, object? obj)
|
||||||
//{
|
{
|
||||||
// _TextBoxKeyEventItem = new()
|
switch (action)
|
||||||
// {
|
{
|
||||||
// { txtGlobalHotkey0,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.ShowForm) },
|
case EViewAction.CloseWindow:
|
||||||
// { txtGlobalHotkey1,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxyClear) },
|
this.Close(true);
|
||||||
// { txtGlobalHotkey2,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxySet) },
|
break;
|
||||||
// { txtGlobalHotkey3,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxyUnchanged)},
|
}
|
||||||
// { txtGlobalHotkey4,GetKeyEventItemByEGlobalHotkey(_config.globalHotkeys,EGlobalHotkey.SystemProxyPac)}
|
return await Task.FromResult(true);
|
||||||
// };
|
}
|
||||||
// BindingData();
|
|
||||||
//}
|
|
||||||
|
|
||||||
//private void TxtGlobalHotkey_PreviewKeyDown(object? sender, KeyEventArgs e)
|
private void Init()
|
||||||
//{
|
{
|
||||||
// e.Handled = true;
|
_textBoxKeyEventItem.Add(txtGlobalHotkey0);
|
||||||
// var _ModifierKeys = new Key[] { Key.LeftCtrl, Key.RightCtrl, Key.LeftShift,
|
_textBoxKeyEventItem.Add(txtGlobalHotkey1);
|
||||||
// Key.RightShift, Key.LeftAlt, Key.RightAlt, Key.LWin, Key.RWin};
|
_textBoxKeyEventItem.Add(txtGlobalHotkey2);
|
||||||
// _TextBoxKeyEventItem[sender].KeyCode = (int)(e.Key == Key.System ? (_ModifierKeys.Contains(e.SystemKey) ? Key.None : e.SystemKey) : (_ModifierKeys.Contains(e.Key) ? Key.None : e.Key));
|
_textBoxKeyEventItem.Add(txtGlobalHotkey3);
|
||||||
// _TextBoxKeyEventItem[sender].Alt = (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt;
|
_textBoxKeyEventItem.Add(txtGlobalHotkey4);
|
||||||
// _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<KeyEventItem> KEList, EGlobalHotkey eg)
|
for (var index = 0; index < _textBoxKeyEventItem.Count; index++)
|
||||||
//{
|
{
|
||||||
// return JsonUtils.DeepCopy(KEList.Find((it) => it.eGlobalHotkey == eg) ?? new()
|
var sender = _textBoxKeyEventItem[index];
|
||||||
// {
|
if (sender is not TextBox txtBox)
|
||||||
// eGlobalHotkey = eg,
|
{
|
||||||
// Control = false,
|
continue;
|
||||||
// Alt = false,
|
}
|
||||||
// Shift = false,
|
txtBox.Tag = (EGlobalHotkey)index;
|
||||||
// KeyCode = null
|
txtBox.KeyDown += TxtGlobalHotkey_PreviewKeyDown;
|
||||||
// });
|
}
|
||||||
//}
|
}
|
||||||
|
|
||||||
//private string KeyEventItemToString(KeyEventItem item)
|
private void TxtGlobalHotkey_PreviewKeyDown(object? sender, KeyEventArgs e)
|
||||||
//{
|
{
|
||||||
// var res = new StringBuilder();
|
e.Handled = true;
|
||||||
|
if (sender is not TextBox txtBox)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// if (item.Control) res.Append($"{ModifierKeys.Control}+");
|
var item = ViewModel?.GetKeyEventItem((EGlobalHotkey)txtBox.Tag);
|
||||||
// if (item.Shift) res.Append($"{ModifierKeys.Shift}+");
|
var modifierKeys = new Key[] { Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, Key.RightShift, Key.LeftAlt, Key.RightAlt, Key.LWin, Key.RWin };
|
||||||
// if (item.Alt) res.Append($"{ModifierKeys.Alt}+");
|
|
||||||
// if (item.KeyCode != null && (Key)item.KeyCode != Key.None)
|
|
||||||
// res.Append($"{(Key)item.KeyCode}");
|
|
||||||
|
|
||||||
// return res.ToString();
|
item.KeyCode = (int)(e.Key == Key.System ? modifierKeys.Contains(Key.System) ? Key.None : Key.System : modifierKeys.Contains(e.Key) ? Key.None : e.Key);
|
||||||
//}
|
item.Alt = (e.KeyModifiers & KeyModifiers.Alt) == KeyModifiers.Alt;
|
||||||
|
item.Control = (e.KeyModifiers & KeyModifiers.Control) == KeyModifiers.Control;
|
||||||
|
item.Shift = (e.KeyModifiers & KeyModifiers.Shift) == KeyModifiers.Shift;
|
||||||
|
|
||||||
//private void BindingData()
|
txtBox.Text = KeyEventItemToString(item);
|
||||||
//{
|
}
|
||||||
// foreach (var item in _TextBoxKeyEventItem)
|
|
||||||
// {
|
|
||||||
// if (item.Value.KeyCode != null && (Key)item.Value.KeyCode != Key.None)
|
|
||||||
// {
|
|
||||||
// (item.Key as TextBox)!.Text = KeyEventItemToString(item.Value);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// (item.Key as TextBox)!.Text = string.Empty;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
//private void btnSave_Click(object? sender, RoutedEventArgs e)
|
private void BindingData()
|
||||||
//{
|
{
|
||||||
// _config.globalHotkeys = _TextBoxKeyEventItem.Values.ToList();
|
foreach (var sender in _textBoxKeyEventItem)
|
||||||
|
{
|
||||||
|
if (sender is not TextBox txtBox)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// if (ConfigHandler.SaveConfig(_config, false) == 0)
|
var item = ViewModel?.GetKeyEventItem((EGlobalHotkey)txtBox.Tag);
|
||||||
// {
|
txtBox.Text = KeyEventItemToString(item);
|
||||||
// HotkeyHandler.Instance.ReLoad();
|
}
|
||||||
// this.Close();
|
}
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// UI.Show(ResUI.OperationFailed);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
//private void btnReset_Click(object? sender, RoutedEventArgs e)
|
private void btnReset_Click(object sender, RoutedEventArgs e)
|
||||||
//{
|
{
|
||||||
// foreach (var k in _TextBoxKeyEventItem.Keys)
|
ViewModel?.ResetKeyEventItem();
|
||||||
// {
|
BindingData();
|
||||||
// _TextBoxKeyEventItem[k].Alt = false;
|
}
|
||||||
// _TextBoxKeyEventItem[k].Control = false;
|
|
||||||
// _TextBoxKeyEventItem[k].Shift = false;
|
|
||||||
// _TextBoxKeyEventItem[k].KeyCode = (int)Key.None;
|
|
||||||
// }
|
|
||||||
// BindingData();
|
|
||||||
//}
|
|
||||||
|
|
||||||
//private void GlobalHotkeySettingWindow_KeyDown(object? sender, KeyEventArgs e)
|
private string KeyEventItemToString(KeyEventItem? item)
|
||||||
//{
|
{
|
||||||
// if (e.Key == Key.Escape)
|
if (item == null)
|
||||||
// {
|
{
|
||||||
// this.Close();
|
return string.Empty;
|
||||||
// }
|
}
|
||||||
//}
|
var res = new StringBuilder();
|
||||||
|
|
||||||
|
if (item.Control)
|
||||||
|
{
|
||||||
|
res.Append($"{KeyModifiers.Control} +");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.Shift)
|
||||||
|
{
|
||||||
|
res.Append($"{KeyModifiers.Shift} +");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.Alt)
|
||||||
|
{
|
||||||
|
res.Append($"{KeyModifiers.Alt} +");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.KeyCode != null && (Key)item.KeyCode != Key.None)
|
||||||
|
{
|
||||||
|
res.Append($"{(Key)item.KeyCode}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.ToString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -12,6 +12,7 @@ using MsBox.Avalonia.Enums;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using Splat;
|
using Splat;
|
||||||
using v2rayN.Desktop.Common;
|
using v2rayN.Desktop.Common;
|
||||||
|
using v2rayN.Desktop.Handler;
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Views
|
namespace v2rayN.Desktop.Views
|
||||||
{
|
{
|
||||||
|
|
@ -138,8 +139,7 @@ namespace v2rayN.Desktop.Views
|
||||||
if (Utils.IsWindows())
|
if (Utils.IsWindows())
|
||||||
{
|
{
|
||||||
ThreadPool.RegisterWaitForSingleObject(Program.ProgramStarted, OnProgramStarted, null, -1, false);
|
ThreadPool.RegisterWaitForSingleObject(Program.ProgramStarted, OnProgramStarted, null, -1, false);
|
||||||
|
HotkeyHandler.Instance.Init(_config, OnHotkeyHandler);
|
||||||
menuGlobalHotkeySetting.IsVisible = false;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -156,7 +156,6 @@ namespace v2rayN.Desktop.Views
|
||||||
|
|
||||||
RestoreUI();
|
RestoreUI();
|
||||||
AddHelpMenuItem();
|
AddHelpMenuItem();
|
||||||
//WindowsHandler.Instance.RegisterGlobalHotkey(_config, OnHotkeyHandler, null);
|
|
||||||
MessageBus.Current.Listen<string>(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI);
|
MessageBus.Current.Listen<string>(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -233,6 +232,7 @@ namespace v2rayN.Desktop.Views
|
||||||
StorageUI();
|
StorageUI();
|
||||||
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||||
{
|
{
|
||||||
|
HotkeyHandler.Instance.Dispose();
|
||||||
desktop.Shutdown();
|
desktop.Shutdown();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -268,21 +268,12 @@ namespace v2rayN.Desktop.Views
|
||||||
ShowHideWindow(null);
|
ShowHideWindow(null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//case EGlobalHotkey.SystemProxyClear:
|
case EGlobalHotkey.SystemProxyClear:
|
||||||
// ViewModel?.SetListenerType(ESysProxyType.ForcedClear);
|
case EGlobalHotkey.SystemProxySet:
|
||||||
// break;
|
case EGlobalHotkey.SystemProxyUnchanged:
|
||||||
|
case EGlobalHotkey.SystemProxyPac:
|
||||||
//case EGlobalHotkey.SystemProxySet:
|
Locator.Current.GetService<StatusBarViewModel>()?.SetListenerType((ESysProxyType)((int)e - 1));
|
||||||
// ViewModel?.SetListenerType(ESysProxyType.ForcedChange);
|
break;
|
||||||
// break;
|
|
||||||
|
|
||||||
//case EGlobalHotkey.SystemProxyUnchanged:
|
|
||||||
// ViewModel?.SetListenerType(ESysProxyType.Unchanged);
|
|
||||||
// break;
|
|
||||||
|
|
||||||
//case EGlobalHotkey.SystemProxyPac:
|
|
||||||
// ViewModel?.SetListenerType(ESysProxyType.Pac);
|
|
||||||
// break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
<PackageReference Include="ReactiveUI.Fody">
|
<PackageReference Include="ReactiveUI.Fody">
|
||||||
<TreatAsUsed>true</TreatAsUsed>
|
<TreatAsUsed>true</TreatAsUsed>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
<PackageReference Include="GlobalHotKeys.Windows" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue