我正在使用它检测我的应用程序上的击键...
[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown
handler:^NSEvent * (NSEvent * theEvent)
好的我可以使用theEvent
来了解输入的字符,并知道是否按下了这个字符:
NSString *typedKey = theEvent.charactersIgnoringModifiers;
BOOL shiftDetected = [theEvent modifierFlags] & NSShiftKeyMask;
我的应用程序有一个界面显示一些按钮,我允许使用键盘而不是单击按钮。该界面特别具有3个按钮,具有第二功能。
例如:第一个按钮有两个功能A
和B
,但只有A
标签显示在该按钮上。让我们说我指定字母Q
是该按钮的键盘快捷键。如果用户按下Q
函数A
,则执行。如果用户按下Shift Q
,则执行功能B
。
但这就是问题所在。我需要检测Shift
的所有按下或发布,因为用户按下Shift
的那一刻我必须将该按钮的标签从A
更改为B
,所以用户知道现在该按钮将导致执行函数B
而不是A
。就像一个键盘在Shift
被保持时会从小写变为大写,并且在Shift
被释放的那一刻变回小写。
我该怎么做?
答案 0 :(得分:2)
我使用addLocalMonitorForEvents
函数创建了一个简单的项目。请检查我的代码,它是Swift代码,但我认为它应该与目标c相同。
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
NSEvent.addLocalMonitorForEvents(matching: [.flagsChanged, .keyDown]) { (theEvent) -> NSEvent? in
if theEvent.modifierFlags.contains(.shift) {
if theEvent.keyCode == 56 { // this is Shif key
print("Shift START!")
}
else {
print("Shift pressed with keycode \(theEvent.keyCode)")
}
}
else {
if theEvent.keyCode == 56 { // this is Shif key
print("Shift END!")
}
else {
print("Normal keycode \(theEvent.keyCode)")
}
}
return theEvent
}
}
这是目标c:
[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskFlagsChanged|NSEventMaskKeyDown handler:^NSEvent * (NSEvent * theEvent) {
if ([theEvent modifierFlags] & NSEventModifierFlagShift) {
if (theEvent.keyCode == 56) { // this is Shif key
NSLog(@"Shift START");
}
else {
NSLog(@"Shift pressed with keycode %d", theEvent.keyCode);
}
}
else {
if (theEvent.keyCode == 56) { // this is Shif key
NSLog(@"Shift END");
}
else {
NSLog(@"Normal keycode %d", theEvent.keyCode);
}
}
return theEvent;
}];
只需将此部分复制并粘贴到AppDelegate
即可进行快速测试。