macOS 15.1 Sequoia Beta下CGEvent鼠标功能失效问题
Mac自动点击器CGEvent失效问题排查与解决
针对你在Xcode 16.0开发Mac自动点击器时遇到的CGEvent无响应问题,以下是几个针对性的排查和解决方向:
检查Xcode的辅助功能权限
直接在Xcode中运行项目时,系统会将权限请求关联到Xcode而非你的应用。前往「设置>隐私与安全性>辅助功能」,确认Xcode已被授予「控制电脑」权限。调整CGEventSource的状态ID
尝试将事件源的stateID从.hidSystemState替换为.combinedSessionState,新系统版本中该状态ID的兼容性更好:let source = CGEventSource(stateID: .combinedSessionState)修改事件投递的Tap类型
将事件投递的Tap类型从.cghidEventTap改为.sessionEventTap,后者更适配当前用户会话内的事件分发逻辑:CGEvent(mouseEventSource: source, mouseType: .leftMouseDown, mouseCursorPosition: mouseLocation, mouseButton: .left)?.post(tap: .sessionEventTap)替换usleep为异步延迟
在主线程调用usleep会阻塞事件循环,导致鼠标事件无法正常投递。改用DispatchQueue实现异步延迟:let source = CGEventSource(stateID: .combinedSessionState) let mouseLocation = NSEvent.mouseLocation // 发送鼠标按下事件 CGEvent(mouseEventSource: source, mouseType: .leftMouseDown, mouseCursorPosition: mouseLocation, mouseButton: .left)?.post(tap: .sessionEventTap) // 延迟0.1秒发送鼠标抬起事件 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { CGEvent(mouseEventSource: source, mouseType: .leftMouseUp, mouseCursorPosition: mouseLocation, mouseButton: .left)?.post(tap: .sessionEventTap) }检查输入监控权限
部分macOS版本除了辅助功能权限,还需要「输入监控」权限支持事件模拟。前往「设置>隐私与安全性>输入监控」,确保应用或Xcode已获得该权限。测试独立打包的App
将项目打包成独立的.app文件运行,调试环境的权限逻辑可能与正式运行环境存在差异,独立运行后再验证功能是否正常。
内容的提问来源于stack exchange,提问作者Slavik
相关产品推荐
相关产品推荐

