当使用NSEvent flagsChanged并使用各种KeyMasks对标志进行AND运算时,如何以独占方式测试? 目前,在模式中使用一系列if else条件:
if ((flags & someKeyMask) && (flags someOtherKeyMask))
即使第三个修改键已关闭,这也会匹配。 在if else条件中更早地放置一系列关键掩码使得行为按照需要工作,但在某种程度上感觉不完整。这是说“只有这些修饰键,而不是其他任何键”的好方法吗?
这是一个更具体的例子,其中第一个与其他人匹配。我想知道是否有办法为每个只添加“只有这些修饰键”的逻辑添加一些逻辑。
if ((flags & (NSCommandKeyMask|NSControlKeyMask))) {
NSLog(@"one");
}else if (((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask)) && (flags & NSControlKeyMask)) {
NSLog(@"Command+Option+Control ");
} else if ((flags & NSCommandKeyMask) && (flags & NSShiftKeyMask)) {
NSLog(@"Command+Shift ");
} else if ((flags & NSCommandKeyMask) && (flags & NSControlKeyMask)) {
NSLog(@"Command+Control");
} else if ((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask)) {
NSLog(@"Command+Option ");
}
因此,Ken Thomases提供的正确模式是:
flags &= (<one or more masks bitwise OR'd together);
if (flags == (<one or more masks bitwise OR'd together)) { // do something }
这提供了独家匹配。
答案 0 :(得分:6)
首先,您需要注意-modifierFlags
返回的值包含一些与键不完全对应的标志。你应该构建一个掩码,其中包含你关心的所有标志(无论你是否关心它们被按下或没有按下)。将标志值传递给该掩码,然后将结果与您想要的组合进行比较。
例如,如果您关心Command,Option,Shift和Control,并且您想知道Command和Shift是否已关闭但其他人没有关闭,您可以使用:
if ((flags & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)) == (NSShiftKeyMask|NSCommandKeyMask))
// do something
更新:以下是检查各种组合的方法:
flags &= NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask;
if (flags == (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask))
NSLogs(@"Command+Option+Control");
else if (flags == (NSShiftKeyMask|NSCommandKeyMask))
NSLog(@"Command+Shift ");
else if (flags == (NSControlKeyMask|NSCommandKeyMask))
NSLog(@"Command+Control");
else if (flags == (NSAlternateKeyMask|NSCommandKeyMask))
NSLog(@"Command+Option ");
答案 1 :(得分:0)
为了捕捉按下的组合,你需要使用开关/断开构造:
switch (flags) {
case (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask):
[keystrokes appendString:@"cmd-alt-ctrl-"];
break;
case (NSShiftKeyMask|NSCommandKeyMask):
[keystrokes appendString:@"cmd-shift-"];
break;
case (NSControlKeyMask|NSCommandKeyMask):
[keystrokes appendString:@"cmd-ctrl-"];
break;
case (NSAlternateKeyMask|NSCommandKeyMask):
[keystrokes appendString:@"cmd-alt-"];
break;
default:
break;
}