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
相关产品推荐
相关产品推荐

