2011-01-09 37 views
2

我想知道NSEvent是否響應鍵盤上的「Shift」鍵。我在調試我的應用程序時記錄了keyCodes,我沒有得到shift鍵的keyCode值。Cocoa - NSEvent響應SHIFT鍵?

感謝,

凱文

編輯:這是我從一個用戶的響應使用的代碼。

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

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

Shift鍵仍然是不被認可......

+0

這段代碼似乎只在按下Shift鍵的同時按下_another_鍵(例如shift + A)纔有效。當你全部按下Shift鍵時,它不會被觸發。 – 2016-03-25 06:46:55

回答

15

看看flagsChanged:方法NSResponder

事情是這樣的:

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

這個伎倆! :) – lab12 2011-01-09 21:11:25

+0

請匿名-1請解釋一下嗎? – Richard 2011-12-13 16:45:10

2

Shift鍵不具有關鍵代碼,因爲它是一個功能鍵。當您得到一個關鍵事件時,Shift鍵的存在將位於modifierFlags字段中。

+0

Shift鍵在我班的keyDown方法中仍然沒有響應。 – lab12 2011-01-09 20:46:15

9

你的代碼示例不工作,因爲-modifierFlags是位掩碼等測試面罩是否等於NSShiftKeyMask將無法​​正常工作。您需要使用按位AND運營商測試,如果設置了標誌:

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

同樣作爲預留,如果你想存儲這個結果在BOOL,你需要檢查它不等於0,這樣如:

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

如果你離開它,那麼BOOL將評估爲NO(除非你拔出位掩碼的值爲1,其被定義爲YES;對於-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個變量來保存先前的狀態,但可以檢測按並釋放每個修改鍵。