macOS 开发 - MASShortcut


macOS 开发交流 秋秋群:644096295,V : ez-code


关于 MASShortcut

MASShortcut 是一款快捷键管理工具,替代和兼容 ShortcutRecorder


在这里插入图片描述


项目结构

  • model
    • MASKeyCodes : 功能键和快捷键 枚举
    • MASShortcut : 管理 key 的组合(不管是否可用)
    • MASShortcutValidator 验证shortcut 是否可用
  • Monitoring
    • MASHotKey : 初始化和注册 MASShortcut
    • MASShortcutMonitor : 注册/解除/检测 MASShortcut,监控更新
  • User Defaults Storage
    • MASDictionaryTransformer : 转换 shortcut 数据格式,以便于存储
    • MASShortcutBinder : 绑定用户操作和 shortcut
  • UI
    • MASLocalization : 替代 NSLocalizedString,以便退出 app 时,能从 framework 种读取字符串。
    • MASShortcutView : Shortcut 视图图
    • MASShortcutViewButtonCell : MASShortcutView 内部的 cell 样式,可调整和重绘
    • MASShortcutView+Bindings : 设置关联的默认键

快速使用

单独使用一个 MASShortcutView
你可以修改 它的属性,来改变显示的样式


    MASShortcutView *shortCutView = [[MASShortcutView alloc] initWithFrame:NSMakeRect(10, 10, 200, 50)];
    [self.window.contentView addSubview:shortCutView];
    
    shortCutView.wantsLayer = YES;
    shortCutView.layer.backgroundColor = [NSColor blueColor].CGColor;


源码学习

检测是否有热键冲突

MASShortcutValidator.m

- (BOOL) isShortcutAlreadyTakenBySystem:(MASShortcut *)shortcut explanation: (NSString**) explanation
{
   
    CFArrayRef globalHotKeys;
    if (CopySymbolicHotKeys(&globalHotKeys) == noErr) {
   

        // Enumerate all global hotkeys and check if any of them matches current shortcut
        for (CFIndex i = 0, count = CFArrayGetCount(globalHotKeys); i < count; i++) {
   
            
            CFDictionaryRef hotKeyInfo = CFArrayGetValueAtIndex(globalHotKeys, i);
            
            CFNumberRef code = CFDictionaryGetValue(hotKeyInfo, kHISymbolicHotKeyCode);
            CFNumberRef flags = CFDictionaryGetValue(hotKeyInfo, kHISymbolicHotKeyModifiers);
            CFNumberRef enabled = CFDictionaryGetValue(hotKeyInfo, kHISymbolicHotKeyEnabled);

            if (([(__bridge NSNumber *)code integerValue] == [shortcut keyCode]) &&
                ([(__bridge NSNumber *)flags unsignedIntegerValue] == [shortcut carbonFlags]) &&
                ([(__bridge NSNumber *)enabled boolValue])) {
   

                if (explanation) {
   
                    *explanation = MASLocalizedString(@"This combination cannot be used because it is already used by a system-wide "
                                                     @"keyboard shortcut.\nIf you really want to use this key combination, most shortcuts "
                                                     @"can be changed in the Keyboard & Mouse panel in System Preferences.",
                                                     @"Message for alert when shortcut is already used by the system");
                }
                return YES;
            }
        }
        CFRelease(globalHotKeys);
    }
    return [self isShortcut:shortcut alreadyTakenInMenu:[NSApp mainMenu] explanation:explanation];
}
  • CopySymbolicHotKeys 来自 Carbon – HiToolbox – CarbonEvents.h

处理 Event

- (void) handleEvent: (EventRef) event
{
   
    if (GetEventClass(event) != kEventClassKeyboard) {
   
        return;
    }

    EventHotKeyID hotKeyID;
    OSStatus status = GetEventParameter(event, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(hotKeyID), NULL, &hotKeyID);
    if (status != noErr || hotKeyID.signature != MASHotKeySignature) {
   
        return;
    }

    [_hotKeys enumerateKeysAndObjectsUsingBlock:^(MASShortcut *shortcut, MASHotKey *hotKey, BOOL *stop) {
   
        if (hotKeyID.id == [hotKey carbonID]) {
   
            if ([hotKey action]) {
   
                dispatch_async(dispatch_get_main_queue(), [hotKey action]);
            }
            *stop = YES;
        }
    }];
}

https://music.163.com/#/song?id=865632948
伊织 2023-12-22

相关推荐

  1. mac qt android开发环境

    2023-12-23 10:28:04       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-23 10:28:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-23 10:28:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-23 10:28:04       82 阅读
  4. Python语言-面向对象

    2023-12-23 10:28:04       91 阅读

热门阅读

  1. 2023最新Python全栈开发学习路线

    2023-12-23 10:28:04       57 阅读
  2. NPM的介绍和使用

    2023-12-23 10:28:04       58 阅读
  3. WPF StackPanel

    2023-12-23 10:28:04       60 阅读
  4. 零基础学C语言——函数

    2023-12-23 10:28:04       58 阅读
  5. VR室内设计仿真教学情景实训

    2023-12-23 10:28:04       68 阅读
  6. 做接口测试时需要验证数据库么?

    2023-12-23 10:28:04       59 阅读
  7. Linux中硬盘(IDE、SCSI)的命名规则

    2023-12-23 10:28:04       58 阅读
  8. ceph集群搭建详细教程(ceph-deploy)

    2023-12-23 10:28:04       50 阅读