NSEvent 是 macOS AppKit 框架中用于表示用户输入事件(例如鼠标、键盘、触控板等)的核心类。几乎所有用户交互行为都会被封装为一个 NSEvent 对象,并由系统传递给 app 的响应链。
基本功能
NSEvent 代表系统级事件对象,可以:
监听键盘按键(按下、松开)。
监听鼠标移动、点击、滚动。
监听触控板手势(两指滚动、捏合缩放等)。
响应系统事件(如 app 激活、窗口焦点变化)。
常见事件类型
NSEvent.EventType 是枚举类型,代表事件种类:
1、.leftMouseDown:鼠标左键按下。
2、.rightMouseUp:鼠标右键放开。
3、.mouseMoved:鼠标移动。
4、.scrollWheel:鼠标滚轮或触控板滚动。
5、.keyDown:键盘按下。
6、.keyUp:键盘松开。
7、.flagsChanged:修饰键(Shift/Command)变化。
8、.magnify:捏合放大。
9、.swipe:触控板滑动。
常用属性
1、type:NSEvent.EventType类型,事件类型。
2、locationInWindow:NSPoint类型,鼠标/触摸事件相对窗口的位置。
3、modifierFlags:NSEvent.ModifierFlags类型,当前按下的修饰键(如 ⌘ ⌥ ⇧)。
可组合使用:
event.modifierFlags.contains(.command)
event.modifierFlags.contains(.shift)
event.modifierFlags.intersection([.command, .option])
全部修饰符包括:.command、.option、.shift、.control、.capsLock和.function(Fn)。
4、characters:String?类型,键盘事件输入的字符。
5、keyCode:UInt16类型,原始键盘 keyCode。
6、deltaX / deltaY:CGFloat类型,滚轮或手势滑动距离。
7、timestamp:TimeInterval类型,事件发生的时间戳。
常见函数
自定义事件响应的常见函数(可在 NSView、NSWindow 中重写)。
1、mouseDown(with:):鼠标按下。
2、mouseDragged(with:):鼠标拖动。
3、mouseUp(with:):鼠标释放。
4、scrollWheel(with:):鼠标滚动。
5、keyDown(with:):键盘按下。
6、keyUp(with:):键盘松开。
使用示例
1、重写 keyDown 处理键盘事件
override func keyDown(with event: NSEvent) {
if event.characters == "a" {
print("A 键被按下")
}
}
2、鼠标点击事件
override func mouseDown(with event: NSEvent) {
let point = event.locationInWindow
print("鼠标点击位置:\(point)")
}
3、监听全局事件(例如捕获快捷键)
NSEvent.addGlobalMonitorForEvents(matching: .keyDown) { event in
print("全局按键:\(event.characters ?? "")")
}
GlobalMonitor 无法处理事件(例如不能拦截),只能监听。
事件传递机制
NSEvent 被系统发送到视图树上的响应链中,由最先响应的 NSResponder(比如 NSView, NSWindow, NSViewController)依次处理。
比如:
1、用户点击窗口 → 系统创建 NSEvent。
2、发送到最前面的窗口(NSWindow)。
3、传递到窗口的 contentView。
4、传到具体控件(如 NSButton)。
总结
在macOS(AppKit)开发中,监听键盘和鼠标、处理触控板手势、实现快捷键等功能,需要使用NSEvent。