2010-12-12 9 views
3

イベントタップを設定すると、CGEventを使ってどの修飾キーが押されたのか特定できません。CGEventタップで押された修飾キーを取得する

CGEventFlags flagsP; 

flagsP=CGEventGetFlags(event); 

NSLog(@"flags: 0x%llX",flagsP); 
NSLog(@"stored: 0x%llX",kCGEventFlagMaskCommand); 

if (flagsP==kCGEventFlagMaskCommand) { 
     NSLog(@"command pressed"); 
    } 

上記のスニペットを指定すると、最初のNSLogは2番目のNSLogから別の値を返します。コマンド修飾キーが押されたときに条件が実行されることはありません。

特定のCGEventに対して、コマンド、代替、オプション、コントロール、またはシフトが押されたかどうかを確認する必要があります。まず、私は上記がうまくいかない理由を理解する助けが必要です。

ありがとうございます!

答えて

6

これらはビットマスクで、CGEventGetFlagsから受け取った値(または自分でイベントを作成するときに渡す)にビット単位でOR演算されます。

複数のビットマスクの組み合わせに等しい単一のビットマスクが存在しないため、ここでは等価をテストできません。単一のビットの等価性をテストする必要があります。

組み合わせビットマスクから単一ビットマスクの値を抽出するには、ビット単位AND(&)演算子を使用します。

BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand; 

なぜ両方:その後、あなたが興味のあるマスクのシングルビットにそれを比較しますか?

&発現はsigned charあるBOOLのサイズに収まらない場合があり、この場合、であるCGEventFlagsそのオペランドと同じ型を評価します。 ==式では、1または0に解決されます。これはすべてBOOLに収まるものです。その問題に対する

他の解決策は、二回(!!)値を否定し、bool又は_BoolなくBoolean又はBOOLとして変数を宣言含みます。 C99の_Boolタイプ(stdbool.hをインクルードするとboolと同義)は、==!!のソリューションと同じように、その値を1または0に強制します。

+0

ありがとう、ピーター。それはそれを非常にうまく説明し、私の問題を解決します。 – the979kid

+0

モディファイアが押されているかどうかを確認する方法があるかどうかを知っていますか?あるいは、それぞれのように明示的にチェックする必要がありますか? –

+0

私はこれをしましたが、それが最高の/きれいな方法であるかどうかわかりません。 'BOOL isModifierPressed =(フラグ&(kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand | kCGEventFlagMaskControl | kCGEventFlagMaskShift))> 0; ' –

関連する問題