Swift中如何检测fn功能键的按压事件?
解决 macOS 下检测fn按键事件不生效问题
问题原因
fn属于系统级修饰键,单独按下时不会触发常规的keyDown/keyUp按键事件,只会触发修饰符状态变更事件,所以你之前通过匹配普通按键keyCode的逻辑无法生效。
解决方法
1. 前置依赖
需要导入Carbon的HIToolbox模块,同时如果要做全局监听,需要先在「系统设置>隐私与安全性>辅助功能」中给你的应用开启权限。
2. 监听修饰符状态变更事件
你需要监听flagsChanged类型的事件,通过判断modifierFlags中的function标记识别fn按键的按下状态:
应用内监听代码示例(Swift)
import Cocoa import Carbon.HIToolbox // 添加本地事件监听器,仅捕获App激活状态下的事件 NSEvent.addLocalMonitorForEvents(matching: .flagsChanged) { event in if event.modifierFlags.contains(.function) { print("fn key pressed") // 若不需要事件继续向下传递,可返回nil,否则返回原event return event } return event }
全局监听代码示例(App后台也可捕获)
import Cocoa import Carbon.HIToolbox // 添加全局事件监听器,需要辅助功能权限才可生效 NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) { event in if event.modifierFlags.contains(.function) { print("fn key pressed globally") } }
注意事项
- 仅当你需要检测
fn与其他按键的组合输入时,才需要用到kVK_Function常量匹配键码,单独检测fn按键不需要使用该常量 - 全局监听场景下如果没有开启辅助功能权限,代码不会抛出异常但无法收到事件回调
- 若要检测fn键松开的状态,可以在
flagsChanged事件中判断event.modifierFlags不包含.function的场景
内容的提问来源于stack exchange,提问作者Ram Patra
相关产品推荐
相关产品推荐

