如何专门捕获修饰键?

时间:2013-02-10 03:27:25

标签: objective-c cocoa nsevent

当使用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 }

这提供了独家匹配。

2 个答案:

答案 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;
        }