2

NSEvent flagsChanged を使用し、さまざまな KeyMask でフラグを AND 演算する場合、どうすればそれらを排他的な方法でテストできますか? 現在、次のパターンの一連の if else 条件を使用しています。

if ((flags & someKeyMask) && (flags someOtherKeyMask))

これは、3 番目の修飾キーが押されていても一致します。より長い一連のキー マスクを 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 に答える