SwiftUI macOS:如何实现全局修饰键+点击/强制触控事件
在macOS SwiftUI中全局监听鼠标/触控板事件的方案
一、全局监听带修饰键的鼠标点击(如Command+Click)
SwiftUI本身没有原生的全局事件监听API,需要借助AppKit的NSEvent.addGlobalMonitorForEvents(matching:handler:)实现系统级事件监听。这个方法能在应用前台或后台状态下捕获事件,但需注意:应用必须获得辅助功能权限,否则后台监听会失效。
示例代码:
import SwiftUI @main struct GlobalClickMonitorApp: App { var body: some Scene { WindowGroup { ContentView() .onAppear { // 监听左键按下事件,检测Command修饰键 NSEvent.addGlobalMonitorForEvents(matching: .leftMouseDown) { event in if event.modifierFlags.contains(.command) { print("Command+左键点击触发") // 在这里添加你的业务逻辑 } } // 监听右键点击(含Control+Click模拟右键) NSEvent.addGlobalMonitorForEvents(matching: .rightMouseDown) { _ in print("右键点击触发") } } } } }
- 该方法不会拦截事件,系统仍会将事件传递给当前活跃应用;若需拦截事件,改用
NSEvent.addLocalMonitorForEvents(matching:handler:),但此方法仅能监听应用自身的事件,不具备全局能力。
二、监听Force Touch事件
Force Touch的监听同样依赖NSEvent,通过读取事件的pressure属性判断是否是重压操作:
// 先判断设备是否支持Force Touch if NSTouchPressureCapabilities.pressureCapabilities.contains(.force) { NSEvent.addGlobalMonitorForEvents(matching: .leftMouseDown) { event in // 阈值可根据设备实际情况调整,通常大于0.5即为重压 if event.pressure > 0.5 { print("Force Touch触发") } } }
三、权限配置说明
全局事件监听需要用户授予辅助功能权限,首次运行时系统会自动弹出权限请求。需在应用的Info.plist中添加NSAccessibilityUsageDescription键,填写权限申请的原因(例如“需要监听全局鼠标事件以提供快捷操作”),否则权限请求会被系统拒绝。
四、局部视图内的事件监听(非全局场景)
如果仅需在SwiftUI视图范围内监听这类事件,无需全局监听的话,可直接使用onTapGesture结合修饰键:
ContentView() .onTapGesture(modifiers: .command) { print("视图内Command+Click触发") }
内容的提问来源于stack exchange,提问作者lizard
相关产品推荐
相关产品推荐

