2

当使用 NSEvent flagsChanged 并使用各种 KeyMask 对标志进行 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 }

这给出了排他匹配。

4

2 回答 2

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 ");
于 2013-02-10T04:37:45.827 回答
0

为了抓住按下的组合,您需要使用 switch/break 结构:

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;
        }
于 2015-04-24T20:15:24.080 回答