Swift MacApp鼠标点击事件触发失败及沙箱截图权限相关问题
问题解答
一、鼠标左键点击失效修复
你当前的代码存在两个核心问题:
- 缺少
leftMouseDown(左键按下)事件,完整的点击事件流为「鼠标移动到目标位置→左键按下→左键抬起」,你仅发送了鼠标移动和两次左键抬起事件,自然无法触发点击。 - 递归调用逻辑冗余,
alreadyClicked全局变量控制的递归逻辑容易引发不可预期的重复调用,建议直接移除。
修复后的代码如下:
func MouseClick(cursorLocation p0: CGPoint) { print("MouseClick", p0) // 随机延迟模拟人工操作间隔 usleep(useconds_t(Int.random(in: 30000..<100000))) // 移动鼠标到目标位置 MoveCursor(cursorLocation: p0) CGEvent(mouseEventSource: nil, mouseType: .mouseMoved, mouseCursorPosition: p0, mouseButton: .left)?.post(tap: .cghidEventTap) usleep(50000) // 发送左键按下事件 CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: p0, mouseButton: .left)?.post(tap: .cghidEventTap) usleep(50000) // 发送左键抬起事件 CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: p0, mouseButton: .left)?.post(tap: .cghidEventTap) }
注意:使用CGEvent发送系统级操作需要先给App授予辅助功能权限,打开「系统偏好设置>安全性与隐私>隐私>辅助功能」,勾选你的App即可;如果是从Xcode直接启动调试,还需要同时勾选Xcode的辅助功能权限。
二、截图权限与全系统视图捕获问题
1. 读取全系统视图实现
你是自用工具不需要上架App Store,直接关闭沙箱即可解除沙箱的访问限制:
打开Xcode项目,选中Target > 切换到「Signing & Capabilities」标签 > 找到App Sandbox条目,点击左上角的减号将其移除即可。
关闭沙箱后,只要拿到屏幕录制权限就能捕获所有系统窗口的内容。
2. 永久授予截图权限
不需要每次运行都申请,手动在系统设置中配置即可:
打开「系统偏好设置>安全性与隐私>隐私>屏幕录制」,勾选你的App(调试阶段需要同时勾选Xcode),之后启动应用就不会再弹出权限申请窗口。如果配置后依然不生效,可以先删除列表中的对应条目,重新勾选后重启App即可。
macOS 11.x版本存在权限缓存异常的问题,如果配置后依然无法正常截图,重启一次设备即可修复。
内容的提问来源于stack exchange,提问作者Buzka91
相关产品推荐
相关产品推荐

