#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