Skip to content

Commit

Permalink
新增 情景激活/停止快捷键
Browse files Browse the repository at this point in the history
优化 快捷键注册流程
优化 搜索框性能
  • Loading branch information
MakesYT committed Nov 5, 2023
1 parent f4934a4 commit f98c68f
Show file tree
Hide file tree
Showing 11 changed files with 221 additions and 69 deletions.
16 changes: 16 additions & 0 deletions Core/SDKs/CustomScenario/CustomScenario.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Core.SDKs.CustomType;
using Core.SDKs.HotKey;
using Core.SDKs.Services.Config;
using Core.SDKs.Services.Plugin;
using Core.SDKs.Tools;
using Core.ViewModel.TaskEditor;
Expand All @@ -32,6 +34,9 @@ public partial class CustomScenario : ObservableRecipient, IDisposable
[JsonIgnore] [ObservableProperty] private bool _isRunning = false;

[JsonIgnore] [ObservableProperty] private string _name = "任务";

[JsonIgnore] [ObservableProperty] private HotKeyModel? _startHotKeyModel;
[JsonIgnore] [ObservableProperty] private HotKeyModel? _stopHotKeyModel;
private Dictionary<PointItem, Thread?> _tickTasks = new();
private TickUtil? _tickUtil;

Expand Down Expand Up @@ -709,4 +714,15 @@ private void ParsePointItem(Dictionary<PointItem, Thread?> threads, PointItem no
private void OnDeserializing(StreamingContext context) //反序列化时hotkeys的默认值会被添加,需要先清空
{
}

[OnDeserialized]
// ReSharper disable once UnusedMember.Local
// ReSharper disable once UnusedParameter.Local
private void OnDeserialized(StreamingContext context) //反序列化时hotkeys的默认值会被添加,需要先清空
{
StartHotKeyModel =
ConfigManger.Config.hotKeys.FirstOrDefault(e => e.SignName == $"Kitopia情景_{UUID}_激活快捷键");
StopHotKeyModel =
ConfigManger.Config.hotKeys.FirstOrDefault(e => e.SignName == $"Kitopia情景_{UUID}_停止快捷键");
}
}
5 changes: 4 additions & 1 deletion Core/SDKs/Services/IHotKeyEditor.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
namespace Core.SDKs.Services;
using Core.SDKs.HotKey;

namespace Core.SDKs.Services;

public interface IHotKeyEditor
{
void EditByName(string name, object? owner);
void EditByHotKeyModel(HotKeyModel name, object? owner);
}
5 changes: 4 additions & 1 deletion Core/ViewModel/SearchWindowViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ partial void OnSearchChanged(string? value)
Log.Debug("搜索变更:" + Search);
Items.RaiseListChangedEvents = false;
#region 清除上次搜索结果
Expand Down Expand Up @@ -618,6 +618,9 @@ partial void OnSearchChanged(string? value)
};
Items.Add(item);
}
Items.RaiseListChangedEvents = true;
Items.ResetBindings();
});
}

Expand Down
63 changes: 63 additions & 0 deletions Core/ViewModel/TaskEditor/TaskEditorViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using Core.SDKs.CustomScenario;
using Core.SDKs.HotKey;
using Core.SDKs.Services;
using Core.SDKs.Services.Config;
using Core.SDKs.Services.Plugin;
Expand Down Expand Up @@ -149,6 +151,12 @@ public TaskEditorViewModel()
}
};
Scenario.nodes.Add(nodify3);
if (Scenario.UUID == null)
{
Scenario.UUID = Guid.NewGuid().ToString();
}


//nodeMethods.Add("new PointItem(){Title = \"Test\"}");
}

Expand All @@ -163,6 +171,61 @@ public PendingConnectionViewModel PendingConnection
get;
}

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();

[RelayCommand]
private void StartHotkeyEditor()
{
var hwndSource = System.Windows.Interop.HwndSource.FromHwnd(GetForegroundWindow());
if (hwndSource == null)
{
return;
}

var xx = (Window)hwndSource.RootVisual;

if (Scenario.StartHotKeyModel == null)
{
var hotKeyModel = new HotKeyModel()
{ MainName = $"Kitopia情景", Name = $"{Scenario.UUID}_激活快捷键", IsUsable = true };
Scenario.StartHotKeyModel = hotKeyModel;
((IHotKeyEditor)ServiceManager.Services.GetService(typeof(IHotKeyEditor))!).EditByHotKeyModel(hotKeyModel,
xx);
}
else
{
((IHotKeyEditor)ServiceManager.Services.GetService(typeof(IHotKeyEditor))!).EditByHotKeyModel(
Scenario.StartHotKeyModel, xx);
}
}

[RelayCommand]
private void StopHotkeyEditor()
{
var hwndSource = System.Windows.Interop.HwndSource.FromHwnd(GetForegroundWindow());
if (hwndSource == null)
{
return;
}

var xx = (Window)hwndSource.RootVisual;

if (Scenario.StopHotKeyModel == null)
{
var hotKeyModel = new HotKeyModel()
{ MainName = $"Kitopia情景", Name = $"{Scenario.UUID}_停止快捷键", IsUsable = true };
Scenario.StopHotKeyModel = hotKeyModel;
((IHotKeyEditor)ServiceManager.Services.GetService(typeof(IHotKeyEditor))!).EditByHotKeyModel(hotKeyModel,
xx);
}
else
{
((IHotKeyEditor)ServiceManager.Services.GetService(typeof(IHotKeyEditor))!).EditByHotKeyModel(
Scenario.StopHotKeyModel, xx);
}
}

[RelayCommand]
private void VerifyNode()
{
Expand Down
6 changes: 5 additions & 1 deletion uToolkitopia/Controls/HotKeyShow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ public enum KeyTypeE
{
((HotKeyShow)o).HotKeyModel =
ConfigManger.Config.hotKeys.FirstOrDefault(e => ($"{e.MainName}_{e.Name}".Equals(args.NewValue)));
if (((HotKeyShow)o).HotKeyModel is null)
{
((HotKeyShow)o).KeyType = KeyTypeE.None;
}
}));

public static readonly DependencyProperty HotKeyModelProperty = DependencyProperty.Register(nameof(HotKeyModel),
Expand All @@ -46,7 +50,7 @@ public enum KeyTypeE

public static readonly DependencyProperty KeyTypeProperty = DependencyProperty.Register(nameof(KeyType),
typeof(KeyTypeE), typeof(HotKeyShow),
new PropertyMetadata(KeyTypeE.Alt));
new PropertyMetadata(KeyTypeE.None));

public static readonly DependencyProperty KeyNameProperty = DependencyProperty.Register(nameof(KeyName),
typeof(string), typeof(HotKeyShow),
Expand Down
24 changes: 24 additions & 0 deletions uToolkitopia/Controls/HotKeyShow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,12 @@
<controls:HotKeyShowItme x:Name="KeyName" Appearance="Primary" FontSize="20"
Foreground="{TemplateBinding Foreground}"
Content="{TemplateBinding KeyName}" Margin="5,0,20,0" Height="40" />
<ui:TextBlock Margin="10" x:Name="None" Text="未设置" VerticalAlignment="Center" HorizontalAlignment="Center" />
<ui:SymbolIcon
x:Name="ControlChevronIcon"
Foreground="{TemplateBinding Foreground}"
Symbol="Edit20" />

</StackPanel>

</ui:Button>
Expand All @@ -75,66 +77,88 @@
<Setter TargetName="Win" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Alt" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Shift" Property="Visibility" Value="Collapsed" />
<Setter TargetName="KeyName" Property="Visibility" Value="Collapsed" />
<Setter TargetName="None" Property="Visibility" Value="Visible" />
</Trigger>
<Trigger Property="KeyType" Value="Ctrl">
<Setter TargetName="Ctrl" Property="Visibility" Value="Visible" />
<Setter TargetName="Win" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Alt" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Shift" Property="Visibility" Value="Collapsed" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="CtrlAlt">
<Setter TargetName="Ctrl" Property="Visibility" Value="Visible" />
<Setter TargetName="Win" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Alt" Property="Visibility" Value="Visible" />
<Setter TargetName="Shift" Property="Visibility" Value="Collapsed" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="CtrlShift">
<Setter TargetName="Ctrl" Property="Visibility" Value="Visible" />
<Setter TargetName="Win" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Alt" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Shift" Property="Visibility" Value="Visible" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="CtrlShiftAlt">
<Setter TargetName="Ctrl" Property="Visibility" Value="Visible" />
<Setter TargetName="Win" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Alt" Property="Visibility" Value="Visible" />
<Setter TargetName="Shift" Property="Visibility" Value="Visible" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="Alt">
<Setter TargetName="Ctrl" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Win" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Alt" Property="Visibility" Value="Visible" />
<Setter TargetName="Shift" Property="Visibility" Value="Collapsed" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="AltShift">
<Setter TargetName="Ctrl" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Win" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Alt" Property="Visibility" Value="Visible" />
<Setter TargetName="Shift" Property="Visibility" Value="Visible" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="Win">
<Setter TargetName="Ctrl" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Win" Property="Visibility" Value="Visible" />
<Setter TargetName="Alt" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Shift" Property="Visibility" Value="Collapsed" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="WinShift">
<Setter TargetName="Ctrl" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Win" Property="Visibility" Value="Visible" />
<Setter TargetName="Alt" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Shift" Property="Visibility" Value="Visible" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="WinAlt">
<Setter TargetName="Ctrl" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Win" Property="Visibility" Value="Visible" />
<Setter TargetName="Alt" Property="Visibility" Value="Visible" />
<Setter TargetName="Shift" Property="Visibility" Value="Collapsed" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="KeyType" Value="Shift">
<Setter TargetName="Ctrl" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Win" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Alt" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Shift" Property="Visibility" Value="Visible" />
<Setter TargetName="KeyName" Property="Visibility" Value="Visible" />
<Setter TargetName="None" Property="Visibility" Value="Collapsed" />
</Trigger>


Expand Down
35 changes: 19 additions & 16 deletions uToolkitopia/SDKs/HotKeyHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,16 @@ namespace Kitopia.SDKs;
/// </summary>
public class HotKeyHelper
{
private static readonly Dictionary<string, int> m_HotKeySettingsDic = new();
private static Dictionary<string, int> m_HotKeySettingsDic = new();

private static readonly ILog log = LogManager.GetLogger(nameof(HotKeyHelper));

public static Dictionary<string, int> MHotKeySettingsDic
{
get => m_HotKeySettingsDic;
set => m_HotKeySettingsDic = value ?? throw new ArgumentNullException(nameof(value));
}

/// <summary>
/// 注册全局快捷键
/// </summary>
Expand Down Expand Up @@ -53,31 +60,27 @@ private static bool RegisterHotKey(HotKeyModel hotKeyModel, IntPtr hWnd)
{
var fsModifierKey = new User32.HotKeyModifiers();
var hotKeySetting = $"{hotKeyModel.MainName}_{hotKeyModel.Name}";
if (!hotKeyModel.IsUsable)
{
return true;
}

log.Debug("注册热键:" + hotKeySetting);


if (!m_HotKeySettingsDic.ContainsKey(hotKeySetting))
if (!Kernel32.GlobalFindAtom(hotKeySetting).IsInvalid)
{
// 全局原子不会在应用程序终止时自动删除。每次调用GlobalAddAtom函数,必须相应的调用GlobalDeleteAtom函数删除原子。
if (!Kernel32.GlobalFindAtom(hotKeySetting).IsInvalid)
{
Kernel32.GlobalDeleteAtom(Kernel32.GlobalFindAtom(hotKeySetting));
}
Kernel32.GlobalDeleteAtom(Kernel32.GlobalFindAtom(hotKeySetting));
}

// 获取唯一标识符
// 获取唯一标识符
if (m_HotKeySettingsDic.ContainsKey(hotKeySetting))
{
m_HotKeySettingsDic[hotKeySetting] = Kernel32.GlobalAddAtom(hotKeySetting).GetHashCode();
}
else
{
// 注销旧的热键
User32.UnregisterHotKey(hWnd, m_HotKeySettingsDic[hotKeySetting]);
m_HotKeySettingsDic.Add(hotKeySetting, Kernel32.GlobalAddAtom(hotKeySetting).GetHashCode());
}

if (!hotKeyModel.IsUsable)
{
return true;
}

// 注册热键
if (hotKeyModel.IsSelectShift)
Expand Down
8 changes: 7 additions & 1 deletion uToolkitopia/Services/HotKeyEditorService.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Linq;
using System.Windows;
using Core.SDKs.HotKey;
using Core.SDKs.Services;
using Core.SDKs.Services.Config;
using Kitopia.View;
Expand All @@ -25,7 +26,12 @@ public void EditByName(string name, object? owner)
return;
}

var hotKeyEditor = new HotKeyEditorWindow(hotKeyModel);
EditByHotKeyModel(hotKeyModel, owner);
}

public void EditByHotKeyModel(HotKeyModel name, object? owner)
{
var hotKeyEditor = new HotKeyEditorWindow(name);
hotKeyEditor.Height = ServiceManager.Services.GetService<MainWindow>().Height / 2;
hotKeyEditor.Width = ServiceManager.Services.GetService<MainWindow>().Width / 2;
if (owner is Window)
Expand Down
6 changes: 6 additions & 0 deletions uToolkitopia/View/HotKeyEditorWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#region

using System.Linq;
using System.Windows;
using System.Windows.Input;
using Windows.System;
Expand Down Expand Up @@ -164,6 +165,11 @@ private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
}

_hotKeyModel.SelectKey = selectedKey.Value;
if (ConfigManger.Config.hotKeys.All(e2 => e2.SignName != _hotKeyModel.SignName))
{
ConfigManger.Config.hotKeys.Add(_hotKeyModel);
}

ConfigManger.Save();
setSuccess = ((MainWindow)ServiceManager.Services.GetService(typeof(MainWindow))).HotKeySet(_hotKeyModel);
if (!setSuccess)
Expand Down
Loading

0 comments on commit f98c68f

Please sign in to comment.