macOS开发因为硬件上有鼠标和键盘的支持,所以我们也有监听硬件输入的需求。
如何监听
监听键盘输入需要使用NSEvent
这个类,这个类是专门管理“事件”的。NSEvent
提供了两个监听的方法:
+ (nullable id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block NS_AVAILABLE_MAC(10_6);
+ (nullable id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent* __nullable (^)(NSEvent*))block NS_AVAILABLE_MAC(10_6);
第一个方法是用于监听其他应用中的事件,第二个是用于监听自己应用的时间。更多详细内容可以阅读官方注释。
在这里我们使用第二个进行监听键盘输入:
id monitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown handler:^NSEvent * _Nullable(NSEvent * _Nonnull aEvent) {
//判断aEvent.keyCode属性
return aEvent;
}];
在方法的block
回调中会收到当前键盘的事件,你需要通过判断aEvent.keyCode
来得知点击了哪一个键。macOS有一个枚举来告诉你键的名字是什么,你可以直接拿来判断(文末附)。
如何终止监听
NSEvent
的监听是需要进行移除的,如果你不进行移除,那么这个需要监听的类再多次init
后,其block
也会在键盘点击时被重复的调用多次。
移除需要使用的类为NSEvent
,方法为:
+ (void)removeMonitor:(id)eventMonitor NS_AVAILABLE_MAC(10_6);
在如何监听那一节,添加监听的方法有一个返回值,这个返回值就是这里removeMonitor
需要传入的参数。在添加了监听的对象dealloc
或合适的时候进行调用即可。
附键盘枚举
/* keycodes for keys that are independent of keyboard layout*/
enum {
kVK_Return = 0x24,
kVK_Tab = 0x30,
kVK_Space = 0x31,
kVK_Delete = 0x33,
kVK_Escape = 0x35,
kVK_Command = 0x37,
kVK_Shift = 0x38,
kVK_CapsLock = 0x39,
kVK_Option = 0x3A,
kVK_Control = 0x3B,
kVK_RightCommand = 0x36,
kVK_RightShift = 0x3C,
kVK_RightOption = 0x3D,
kVK_RightControl = 0x3E,
kVK_Function = 0x3F,
kVK_F17 = 0x40,
kVK_VolumeUp = 0x48,
kVK_VolumeDown = 0x49,
kVK_Mute = 0x4A,
kVK_F18 = 0x4F,
kVK_F19 = 0x50,
kVK_F20 = 0x5A,
kVK_F5 = 0x60,
kVK_F6 = 0x61,
kVK_F7 = 0x62,
kVK_F3 = 0x63,
kVK_F8 = 0x64,
kVK_F9 = 0x65,
kVK_F11 = 0x67,
kVK_F13 = 0x69,
kVK_F16 = 0x6A,
kVK_F14 = 0x6B,
kVK_F10 = 0x6D,
kVK_F12 = 0x6F,
kVK_F15 = 0x71,
kVK_Help = 0x72,
kVK_Home = 0x73,
kVK_PageUp = 0x74,
kVK_ForwardDelete = 0x75,
kVK_F4 = 0x76,
kVK_End = 0x77,
kVK_F2 = 0x78,
kVK_PageDown = 0x79,
kVK_F1 = 0x7A,
kVK_LeftArrow = 0x7B,
kVK_RightArrow = 0x7C,
kVK_DownArrow = 0x7D,
kVK_UpArrow = 0x7E
};