如何直接触发Symbolic Hotkey符号热键实现切换至桌面1
关于直接触发Symbolic Hotkey符号热键的实现方案
可以直接触发指定编号的符号热键,不需要模拟预定义的键盘快捷键,实现方式如下:
- 你当前使用的模拟
Control+数字按键的方案依赖用户自定义的快捷键绑定,一旦用户修改了系统切换桌面的快捷键就会失效,不属于直接调用符号热键的实现。
直接触发118号符号热键的原生实现
通过CoreGraphics构造系统定义事件,直接指定符号热键编号即可触发,不需要传递虚拟按键码和修饰符:
import CoreGraphics // 触发指定编号的Symbolic Hotkey func triggerSymbolicHotkey(hotkeyID: Int) { guard let systemEvent = CGEvent(keyboardEventSource: nil, virtualKey: 0, keyDown: true) else { return } systemEvent.type = .systemDefined // 传入符号热键编号 systemEvent.setIntegerValueField(.eventSourceUserData, value: Int64(hotkeyID)) systemEvent.post(tap: .cghidEventTap) } // 调用:118对应切换到桌面1的符号热键 triggerSymbolicHotkey(hotkeyID: 118)
注意事项
- 该实现需要应用获得辅助功能权限,你需要在项目设置的
Signing & Capabilities中开启辅助功能权限申请,同时引导用户在系统设置>隐私与安全性>辅助功能中允许你的应用运行。 - 如果用户在系统设置>键盘>快捷键>Mission Control中关闭了「切换到桌面1」的功能,触发118号热键不会生效。
可选替代方案:直接调用系统API切换桌面
如果你只需要实现切换到指定桌面的功能,也可以跳过符号热键,直接调用私有CGS API实现,兼容性更强,注意私有API无法上架App Store,仅适合自用/企业级分发场景:
import CoreGraphics private func switchToDesktop(index: Int) { let connection = CGSMainConnectionID() guard let spaces = CGSCopyManagedDisplaySpaces(connection, CGMainDisplayID()) as? [String: Any], let spacesList = spaces["Spaces"] as? [[String: Any]] else { return } // 桌面索引从0开始,切换到第1个桌面取索引0 guard index < spacesList.count, let targetSpaceID = spacesList[index]["id"] as? Int64 else { return } CGSSetActiveWorkspace(connection, targetSpaceID, 0) }
内容的提问来源于stack exchange,提问作者a_kira
相关产品推荐
相关产品推荐

