Swift中如何将NSEvent.keyCode转换为Unicode字符?
解决macOS按键事件转字符的问题
我太懂你遇到的这个坑了——keyCode对应的是键盘上的物理按键位置,和实际输入的字符根本不是一回事!比如美式键盘上A键的keyCode是0,但换成其他布局的键盘,这个keyCode可能对应完全不同的字符,直接想把它转成Unicode标量肯定行不通。
正确的实现思路
要拿到真正的输入字符,直接用NSEvent自带的字符相关属性就好,系统已经帮你处理好了键盘布局、修饰键这些复杂逻辑:
import Cocoa class EditorWindow: NSWindow { override func keyDown(with event: NSEvent) { super.keyDown(with: event) // 获取带修饰键的字符(比如按Shift+A会得到大写"A") if let inputChar = event.characters?.first { Swift.print("实际输入的字符: \(inputChar)") } // 获取忽略修饰键的字符(不管Shift,A和Shift+A都返回小写"a") if let rawChar = event.charactersIgnoringModifiers?.first { Swift.print("忽略修饰键的原始字符: \(rawChar)") } // 保留你原来的keyCode打印,方便对比参考 Swift.print("按键的keyCode: \(event.keyCode)") } }
为什么keyCode不能直接转字符?
keyCode是硬件层面的标识,只对应物理键位,和系统的键盘布局、输入法完全无关。- 同一个
keyCode在不同布局(比如美式、英式、中文拼音)下,对应的字符可能天差地别。 - 而
characters属性是系统处理后的最终结果,会自动考虑当前键盘布局、Shift/Option等修饰键的影响,直接给出用户实际输入的字符。
如果需要处理方向键、功能键这类特殊按键,可以结合keyCode和modifierFlags来判断,普通字符输入用characters就足够啦。
内容的提问来源于stack exchange,提问作者Arthur Guiot
相关产品推荐
相关产品推荐

