20

NSEventのaddLocalMonitorForEventsMatchingMask:handler:メソッドを試してみたところ、次の質問に出くわしました。特定の修飾子だけが押されたかどうかを確認するにはどうすればよいですか?

この質問をコンテキストに設定する簡単な例: ショートカット "⌘+W" をリッスンしたかった。したがって、次のコードを書きました。

[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *theEvent) {
    if ([theEvent modifierFlags] & NSCommandKeyMask && [theEvent keyCode] == 13) {
        [self.window performClose:self];
    }
    return theEvent;
}];

これはうまく機能しますが、「⌃+⌘+W」や「⇧+⌃+⌥+⌘+W」などの修飾キーをさらに押しても、ショートカットがトリガーされます。これを回避する方法はありますか?

簡単な解決策は、他のすべての修飾キーをチェックして、それらが押されていないことを確認することです。これは退屈でエラーが発生しやすいようです。さらに、単項 "&" を使用しているため、十分に醜いです。さらに、(何らかの理由で) 別の修飾キーがキーボード レイアウトに追加されると、問題が発生する可能性があります。

いつものように、あらゆる推奨事項に感謝します。

4

4 に答える 4

34

これでうまくいくと思います:

// Mask out everything but the key flags
NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
if( flags == NSCommandKeyMask ){
    // Got it!
}

元のマスクNSDeviceIndependentModifierFlagsMask.

于 2011-05-21T20:44:48.467 に答える
0

多分もっと良い...

if event.modifierFlags.contains(.shift){
    // do it
}
于 2021-04-19T17:26:30.230 に答える