gpt4 book ai didi

objective-c - 如何才能专门捕获修饰键?

转载 作者:行者123 更新时间:2023-12-03 16:25:51 25 4
gpt4 key购买 nike

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

这提供了独占匹配。

最佳答案

首先,您需要注意从 -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 ");

关于objective-c - 如何才能专门捕获修饰键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14794392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com