2012-12-11 115 views
1

我正在構建一個Cocoa鍵盤管理器,但我無法理解如何正確截取涉及箭頭的標誌組合。箭頭和CMD的修改標誌

例如,我可以在交換機內截獲每個標誌組合:

NSUInteger flags = [theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask; 

switch(flags){ 
    case: NSCommandKeyMask 
     //Command pressed 
    break; 

    case NSCommandKeyMask|NSControlKeyMask 
     //Command + Control 
    break; 
} 

但我不知道如何攔截帶箭頭的組合! 我得到那個箭頭使用NSNumericPadKeyMask作爲面膜...但如果寫的情況下,像這樣的事情發生:

case: NSCommandKeyMask|NSNumericPadKeyMask 
     //Command + arrow ... It doesn't work! 
     int keycode = ... 
    break; 

我該如何處理這個問題和攔截組合,帶箭頭?

回答

1

我不知道這是否是一個BUG與否。攔截CMD +箭頭我要使用這個組合:

case (NSCommandKeyMask|NSFunctionKeyMask|NSNumericPadKeyMask): 

文檔說的箭頭產生NSNumericPadKeyMask,但隻字未提NSFunctionKeyMask

1

箭頭不是修飾符 - 您會在[theEvent keyCode]中找到箭頭鍵。

換句話說,當您收到一個按鍵事件,並且keyCode指示它是其中一個箭頭鍵時,則可以查看modifierFlags以查看在按下箭頭鍵時按住了哪些修飾符。

下面是一個例子:

#define keyModifierMask (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask) 

- (void)keyDown:(NSEvent *)theEvent { 
    NSString *chars = [theEvent characters]; 
    unichar aChar = [chars characterAtIndex: 0]; 
    if (aChar == NSUpArrowFunctionKey 
     || aChar == NSDownArrowFunctionKey 
     || aChar == NSLeftArrowFunctionKey 
     || aChar == NSRightArrowFunctionKey) { 
     NSLog(@"arrow modifiers: %lx",([theEvent modifierFlags]&keyModifierMask)); 
    } 
    [super keyDown: theEvent]; 
} 
+0

你確定嗎?當我按下一個箭頭和一個修飾符(如CMD)時,修飾符標誌會改變(並且它不會僅報告CMD,而是報告CMD加NumericPadKeyMask)。 你可以添加一些代碼來解釋你的理論嗎?我如何攔截箭頭和CMD組合? – MatterGoal

+0

添加工作示例代碼來解釋我的「理論」。 –