#if MACCATALYST
using AppKit;
using Foundation;
namespace TodoList.Maui.Services.Platforms
{
///
/// macOS 平台全局热键服务实现类
/// 使用 AppKit 框架实现全局热键功能
///
public class MacGlobalHotKeyService : IGlobalHotKeyService
{
private NSObject? _eventMonitor;
private Action? _callback;
private bool _isRegistered;
private NSEventModifierMask _currentModifiers;
private string _currentKey;
///
/// macOS 平台支持全局热键
///
public bool IsSupported => true;
///
/// 注册全局热键
///
public void RegisterHotKey(string modifiers, string key, Action callback)
{
_callback = callback;
_currentModifiers = ParseModifiers(modifiers);
_currentKey = key.ToUpper();
if (_isRegistered)
{
UnregisterHotKey();
}
_eventMonitor = NSEvent.AddGlobalMonitorForEventsMatchingMask(
NSEventMask.KeyDown,
HandleKeyDown
);
_isRegistered = true;
}
///
/// 注销全局热键
///
public void UnregisterHotKey()
{
if (_eventMonitor != null)
{
NSEvent.RemoveMonitor(_eventMonitor);
_eventMonitor = null;
_isRegistered = false;
}
}
///
/// 更新热键配置
///
public void UpdateHotKey(string modifiers, string key)
{
if (_callback != null)
{
RegisterHotKey(modifiers, key, _callback);
}
}
///
/// 处理键盘按下事件
///
private void HandleKeyDown(NSEvent evt)
{
bool modifiersMatch = false;
if (_currentModifiers.HasFlag(AppKit.NSEventModifierMask.CommandKey) &&
evt.ModifierFlags.HasFlag(AppKit.NSEventModifierMask.CommandKey))
{
modifiersMatch = true;
}
if (_currentModifiers.HasFlag(AppKit.NSEventModifierMask.AlternateKey) &&
evt.ModifierFlags.HasFlag(AppKit.NSEventModifierMask.AlternateKey))
{
modifiersMatch = true;
}
if (_currentModifiers.HasFlag(AppKit.NSEventModifierMask.ControlKey) &&
evt.ModifierFlags.HasFlag(AppKit.NSEventModifierMask.ControlKey))
{
modifiersMatch = true;
}
if (_currentModifiers.HasFlag(AppKit.NSEventModifierMask.ShiftKey) &&
evt.ModifierFlags.HasFlag(AppKit.NSEventModifierMask.ShiftKey))
{
modifiersMatch = true;
}
if (modifiersMatch && evt.CharactersIgnoringModifiers == _currentKey)
{
_callback?.Invoke();
}
}
///
/// 解析修饰键字符串
///
private AppKit.NSEventModifierMask ParseModifiers(string modifiers)
{
AppKit.NSEventModifierMask mask = 0;
if (string.IsNullOrEmpty(modifiers)) return mask;
var parts = modifiers.Split(',');
foreach (var part in parts)
{
var p = part.Trim();
if (p.Equals("Command", StringComparison.OrdinalIgnoreCase) ||
p.Equals("Cmd", StringComparison.OrdinalIgnoreCase))
{
mask |= AppKit.NSEventModifierMask.CommandKey;
}
if (p.Equals("Option", StringComparison.OrdinalIgnoreCase) ||
p.Equals("Alt", StringComparison.OrdinalIgnoreCase))
{
mask |= AppKit.NSEventModifierMask.AlternateKey;
}
if (p.Equals("Control", StringComparison.OrdinalIgnoreCase))
{
mask |= AppKit.NSEventModifierMask.ControlKey;
}
if (p.Equals("Shift", StringComparison.OrdinalIgnoreCase))
{
mask |= AppKit.NSEventModifierMask.ShiftKey;
}
}
return mask;
}
}
}
#endif