我正在构建一个Cocoa键盘管理器,但我无法理解如何正确拦截涉及箭头的标志组合。
例如,我可以拦截交换机中的每个标志组合:
NSUInteger flags = [theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask;
switch(flags){
case: NSCommandKeyMask
//Command pressed
break;
case NSCommandKeyMask|NSControlKeyMask
//Command + Control
break;
}
但我不知道如何拦截箭组合!
我得到那些箭头使用NSNumericPadKeyMask
作为掩码......但是如果写这样的情况没有任何反应:
case: NSCommandKeyMask|NSNumericPadKeyMask
//Command + arrow ... It doesn't work!
int keycode = ...
break;
如何处理此问题并使用箭头拦截组合?
答案 0 :(得分:1)
箭头不是修饰符 - 您会在[theEvent keyCode]
中找到箭头键。
换句话说,当您收到一个关键事件,并且keyCode
表示它是其中一个箭头键时,您可以查看modifierFlags
以查看正在按下的修改器按下箭头键。
以下是一个例子:
#define keyModifierMask (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)
- (void)keyDown:(NSEvent *)theEvent {
NSString *chars = [theEvent characters];
unichar aChar = [chars characterAtIndex: 0];
if (aChar == NSUpArrowFunctionKey
|| aChar == NSDownArrowFunctionKey
|| aChar == NSLeftArrowFunctionKey
|| aChar == NSRightArrowFunctionKey) {
NSLog(@"arrow modifiers: %lx",([theEvent modifierFlags]&keyModifierMask));
}
[super keyDown: theEvent];
}
答案 1 :(得分:1)
我不知道这是不是BUG。要拦截CMD +箭头,我必须使用这个组合:
case (NSCommandKeyMask|NSFunctionKeyMask|NSNumericPadKeyMask):
文档说箭头会产生NSNumericPadKeyMask
,但它对NSFunctionKeyMask
没有任何说明。