2011-01-09 4 views
2

NSEventがキーボードの "Shift"キーに反応するかどうか疑問に思っていました。私は私のアプリをデバッグするときにkeyCodeを記録していますが、私はシフトキーのkeyCode値を取得しません。Cocoa - NSEvent SHIFTキーに応答しますか?

おかげで、

ケビン

EDIT:これは私がユーザーの応答から使っていたコードです。それはキーモディファイだから

-(void)keyDown:(NSEvent*)event 
{ 

    if ([event modifierFlags] == NSShiftKeyMask) { 
     NSLog(@"Shift key pressed"); 
    } 
} 

Shiftキーがまだ認識されていない...

+0

このコードは、shiftキーを押して_another_キー(例:shift + A)に変更を加えたときにのみ機能します。シフトキーを単独で押すとトリガされません。 –

答えて

15

flagsChanged:の方法をNSResponderとしてください。このような

何か:-modifierFlagsはビットマスクですので、マスクがNSShiftKeyMaskに等しいかどうかをテストすることは動作しませんので、

- (void) flagsChanged:(NSEvent *) event { 
    if ([event modifierFlags] & NSShiftKeyMask) { 
     //Do something 
    } 
} 
+0

そのトリックをした! :) – lab12

+0

匿名-1で説明しますか? – Richard

+0

あなたの問題を修正したコードを投稿した方がいいと思います。 : –

2

Shiftキーは、キーコードを持っていません。キーイベントが発生すると、ShiftキーがmodifierFlagsフィールドに表示されます。

+0

Shiftキーは、私のクラスのkeyDownメソッドではまだ応答しません。 – lab12

9

あなたのコードサンプルは動作しません。あなたはフラグが設定されているかどうかをテストするためにビット単位AND演算子を使用する必要があります。

あなたはそれが0でないことを確認する必要があり BOOLでこの結果を保存したい場合はさておき、などなど。また
if ([event modifierFlags] & NSShiftKeyMask) { 
    NSLog(@"Shift key pressed"); 
} 

BOOL shiftKeyPressed = ([event modifierFlags] & NSShiftKeyMask) != 0; 

あなたはそれを残す場合は、ビットマスクの撤退値はYESのように定義される1である場合を除き、その後BOOLは(NOと評価されます。マスクを始めると-modifierFlagsのために、これは発生しません:として1 << 16)。

2

使用この変更フラグをキャプチャする:ここで

- (void)flagsChanged:(NSEvent *)event 
{ 

} 
3

は、修飾キーの変更を検出したことに私のソリューションです:

- (void)keyboard:(AMKeyboardView *)keyboard flagsChanged:(NSEvent *)event { 
    if ((event.modifierFlags & NSShiftKeyMask) && !lastShiftState) { 
     lastShiftState = true; 
     //Shift pressed - do something 
    } 
    else if (!(event.modifierFlags & NSShiftKeyMask) && lastShiftState) { 
     lastShiftState = false; 
     //Shift released - do something 
    } 

    else if ((event.modifierFlags & NSFunctionKeyMask) && !lastFnState) { 
     lastFnState = true; 
     //Fn pressed - do something 
    } 
    else if (!(event.modifierFlags & NSFunctionKeyMask) && lastFnState) { 
     lastFnState = false; 
     //Fn released - do something 
    } 

    else if ((event.modifierFlags & NSControlKeyMask) && !lastControlState) { 
     lastControlState = true; 
     //Control pressed - do something 
    } 
    else if (!(event.modifierFlags & NSControlKeyMask) && lastControlState) { 
     lastControlState = false; 
     //Control released - do something 
    } 


    else if ((event.modifierFlags & NSAlternateKeyMask) && !lastOptionState) { 
     lastOptionState = true; 
     //Option pressed - do something 
    } 
    else if (!(event.modifierFlags & NSAlternateKeyMask) && lastOptionState) { 
     lastOptionState = false; 
     //Option released - do something 
    } 

    else if ((event.modifierFlags & NSCommandKeyMask) && !lastCommandState) { 
     lastCommandState = true; 
     //Command pressed - do something 
    } 
    else if (!(event.modifierFlags & NSCommandKeyMask) && lastCommandState) { 
     lastCommandState = false; 
     //Command released - do something 
    } 

    else NSLog(@"Other"); 
} 

それは以前の状態を保存するために4つのインスタンス変数が必要ですが、プレスを検出することができますすべての修飾キーを解放します。

+0

このようなものは、修飾キーが解放されたときにはフラグを発行しないので、残念なことに必要です。したがって、各修飾子がいつ解放されたかを追跡するには、フラグが変更され、 。 – Doc

+1

残念ながら、あなたの変数を現実から非同期化することは可能です。たとえば、モディファイアが押されている間にアプリでフォーカスが失われたら、アプリがフォアグラウンドウィンドウではない間にリリースします。 flagsChangedを使用してキーボードを直接サンプリングするメソッドを呼び出す方がよいでしょう。 – Alexander

関連する問題