82 lines
2.6 KiB
C#
82 lines
2.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Windows.Input;
|
|
|
|
namespace Paca.App.Core;
|
|
|
|
public static class GlobalHotkeyParser
|
|
{
|
|
public static bool TryParse(string rawShortcut, out ModifierKeys modifiers, out Key key)
|
|
{
|
|
modifiers = ModifierKeys.None;
|
|
key = Key.None;
|
|
|
|
if (string.IsNullOrWhiteSpace(rawShortcut)) return false;
|
|
|
|
var parts = rawShortcut.Split('+', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
|
|
if (parts.Length == 0) return false;
|
|
|
|
for (int i = 0; i < parts.Length; i++)
|
|
{
|
|
var p = parts[i];
|
|
if (string.Equals(p, "Ctrl", StringComparison.OrdinalIgnoreCase) ||
|
|
string.Equals(p, "Control", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
modifiers |= ModifierKeys.Control;
|
|
}
|
|
else if (string.Equals(p, "Alt", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
modifiers |= ModifierKeys.Alt;
|
|
}
|
|
else if (string.Equals(p, "Shift", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
modifiers |= ModifierKeys.Shift;
|
|
}
|
|
else if (string.Equals(p, "Win", StringComparison.OrdinalIgnoreCase) ||
|
|
string.Equals(p, "Windows", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
modifiers |= ModifierKeys.Windows;
|
|
}
|
|
else
|
|
{
|
|
if (Enum.TryParse<Key>(p, true, out var parsedKey))
|
|
{
|
|
key = parsedKey;
|
|
}
|
|
}
|
|
}
|
|
|
|
return key != Key.None;
|
|
}
|
|
}
|
|
|
|
public class GlobalHotkeyManager
|
|
{
|
|
private readonly Dictionary<string, Action> _callbacks = new(StringComparer.OrdinalIgnoreCase);
|
|
|
|
public static uint GetWin32ModifierFlags(ModifierKeys modifiers)
|
|
{
|
|
uint flags = 0;
|
|
if (modifiers.HasFlag(ModifierKeys.Alt)) flags |= 0x0001;
|
|
if (modifiers.HasFlag(ModifierKeys.Control)) flags |= 0x0002;
|
|
if (modifiers.HasFlag(ModifierKeys.Shift)) flags |= 0x0004;
|
|
if (modifiers.HasFlag(ModifierKeys.Windows)) flags |= 0x0008;
|
|
return flags;
|
|
}
|
|
|
|
public void RegisterVirtualHotkey(string shortcut, Action callback)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(shortcut) || callback == null) return;
|
|
_callbacks[shortcut] = callback;
|
|
}
|
|
|
|
public bool SimulateHotkeyTrigger(string shortcut)
|
|
{
|
|
if (_callbacks.TryGetValue(shortcut, out var action))
|
|
{
|
|
action();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|