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

MacOS 12.6下CGEventPost编译模式失效但解释模式正常求助

问题:Swift模拟媒体按键仅在解释模式生效,编译后失效

我尝试通过编程方式发送自定义按键事件(功能键、媒体键),但该功能仅在解释模式下生效,编译后的代码无法正常运行。

我参考了Stack Overflow上的「emulate media key press on Mac」解决方案,其中Python示例运行正常,Swift脚本形式的代码也可正常工作:

#!/usr/bin/swift
    
import Quartz

let NX_KEYTYPE_SOUND_UP: UInt32 = 0
let NX_KEYTYPE_SOUND_DOWN: UInt32 = 1
let NX_KEYTYPE_PLAY: UInt32 = 16
let NX_KEYTYPE_NEXT: UInt32 = 17
let NX_KEYTYPE_PREVIOUS: UInt32 = 18
let NX_KEYTYPE_FAST: UInt32 = 19
let NX_KEYTYPE_REWIND: UInt32 = 20

let supportedKeys: [String: UInt32] = ["playpause": NX_KEYTYPE_PLAY, "next": NX_KEYTYPE_NEXT, "prev": NX_KEYTYPE_PREVIOUS, "volup": NX_KEYTYPE_SOUND_UP, "voldown": NX_KEYTYPE_SOUND_DOWN]

func HIDPostAuxKey(key: UInt32) {
  func keyDown(_ down: Bool) {
    let flags = NSEvent.ModifierFlags(rawValue: (down ? 0xa00 : 0xb00))
    let data1 = Int((key << 16) | (down ? 0xa00 : 0xb00))

    let ev = NSEvent.otherEvent(with: NSEvent.EventType.systemDefined,
                                location: NSPoint(x:0,y:0),
                                modifierFlags: flags,
                                timestamp: 0,
                                windowNumber: 0,
                                context: nil,
                                subtype: 8,
                                data1: data1,
                                data2: -1)
    let cev = ev?.cgEvent
    cev?.post(tap: CGEventTapLocation.cghidEventTap)
  }

  keyDown(true)
  keyDown(false)
}

HIDPostAuxKey(key: supportedKeys[CommandLine.arguments[1]]!)

执行chmod a+x keypress.swift后,通过终端运行./keypress.swift volup可正常调高音量,屏幕也会显示音量HID提示。

但使用swiftc -o keypress keypress.swift编译成二进制文件后,即使将keypress添加到「安全性与隐私-辅助功能」列表中,运行也无任何反应,无报错信息。

我也曾尝试在Xcode中编写CLI应用,无论用Swift还是Obj-C,确认未启用沙箱,仍无法正常触发按键事件。

我困惑的是相同代码在解释模式正常,编译模式却失效,请问编译时是否需要添加特定参数?目前已无思路,求助解决方案。

环境:MacOS 12.6.2、Xcode 14.2、Swift 5


内容的提问来源于stack exchange,提问作者Stephan Burlot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:05:18