怎么换自己的网站服务器低代码网站开发平台
文章目录
- 关于 MASShortcut
 - 项目结构
 
- 快速使用
 - 源码学习
 - 检测是否有热键冲突
 - 处理 Event
 
macOS 开发交流 秋秋群:644096295,V : ez-code
关于 MASShortcut
MASShortcut 是一款快捷键管理工具,替代和兼容 ShortcutRecorder
- github : https://github.com/cocoabits/MASShortcut
 

项目结构
- 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 shortcutfor (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
