【求助】Mac上实现注册热键功能的疑惑

背景

做一个小demo,需要实现热键功能。

通过搜索和问AI折腾了一番,基本实现了功能,通过Combine提供的RegisterEventHotKey函数实现。

不过这个操作需要把程序添加到系统【隐私与安全】里的【辅助功能】列表里才能生效。

如下图

问题

Max上的微信和企业微信,都提供了热键功能,用来启动屏幕截图。发现它们都没有在【辅助功能】列表里,如上图所示。

所以想问问各位大神,有什么方式实现热键,不用开启辅助功能权限。

实现代码

swift 复制代码
import SwiftUI
import Carbon
import Combine

class HotkeyViewModel: ObservableObject {
    private var hotKeyRef: EventHotKeyRef?
    @Published var isPermissionGranted: Bool = false
    
    init() {
        requestAccessibilityPermission()
    }
    
    private func requestAccessibilityPermission() {
        var trusted = false
        let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeRetainedValue() as NSString: true]
        if #available(OSX 10.9, *) {
            trusted = AXIsProcessTrustedWithOptions(options)
        } else {
            trusted = AXIsProcessTrusted()
        }
        // 没有把程序添加到【辅助功能】列表里,trusted会为false, 注册热键会不成功
        if !trusted {
            print("Please enable accessibility permissions")
            return
        }
        isPermissionGranted = true
    }
    
    func registerHotkey() {
        var eventType = EventTypeSpec()
        eventType.eventClass = OSType(kEventClassKeyboard)
        eventType.eventKind = UInt32(kEventHotKeyPressed)
        
        let eventHandler: EventHandlerUPP = { (nextHandler, theEvent, userData) -> OSStatus in
            print("Hotkey pressed!")
            return noErr
        }
        
        var hotKeyID = EventHotKeyID()
        hotKeyID.signature = OSType(1)
        hotKeyID.id = UInt32(kVK_ANSI_A)
        
        let modifiers = UInt32(cmdKey | controlKey)
        RegisterEventHotKey(UInt32(kVK_ANSI_A), modifiers, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef)
        
        InstallEventHandler(GetEventDispatcherTarget(), eventHandler, 1, &eventType, nil, nil)
    }
}

struct ContentView: View {
    @StateObject var viewModel = HotkeyViewModel()
        
        var body: some View {
            VStack {
                Text("Accessibility Permission: \(viewModel.isPermissionGranted ? "Granted" : "Not Granted")")
                    .padding()
                Button("Register Hotkey") {
                    viewModel.registerHotkey()
                }
            }
        }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
相关推荐
布莱克6053 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
布莱克6053 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型
fthux2 天前
总想着“忙完再休息”?让 Tick Rest 提醒你,先歇一会儿
开源·github·mac·swift·提醒·消息提醒·tick rest·tick rest for mac·消息提醒app
东坡肘子3 天前
参与学生移动应用大赛有感 -- 肘子的 Swift 周报 #161
人工智能·swiftui·swift
songgeb8 天前
YYImage Bug:一行之差,正常 JPEG 如何在 iOS 被读成条纹
ios·swift
fthux8 天前
Tick Rest,一个休息提醒工具的自我修养
macos·开源·swift
Fatbobman(东坡肘子)9 天前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
chaoahyl9 天前
WaterDiary 喝水记录 App 实战(2)· 实现喝水首页与本地保存
swift
茶底世界之下10 天前
iPhone Duo 适配实战,Awaking 踩过的 8 个坑
ios·swiftui·swift
xbzb10 天前
Swift 对象存储建环实验 + Ceilometer 计量:两个收尾服务
swift·ring·实验·ceilometer·象存储·建环