当使用NSEvent flagsChanged并将标志与各种KeyMask进行and运算时,如何以独占的方式测试它们?目前,使用了一系列其他条件的模式:
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 }
这提供了排他性匹配。
首先,您需要注意从-modifierFlags
返回的值包含一些与键不完全对应的标志。您应该构造一个掩码,其中包括您关心的所有标志(无论您是否关心它们被按下)。通过该掩码传递标志值,然后将结果与所需的组合进行比较。
例如,如果您关心Command、Option、Shift和Control,并且您想知道Command和Shift是否确实处于关闭状态,而其他命令和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 ");
为了只捕捉按下的组合,您需要使用开关/中断结构:
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;
}