目标c-如何只捕获修改键



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

相关内容

  • 没有找到相关文章

最新更新