You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何直接触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:36:02