2013-02-10 53 views
2

當使用NSEvent flagsChanged和與各種KeyMasks進行AND操作時,如何測試min是一種獨特的方式? 目前,利用一系列的if else條件白衣模式:如何唯一捕獲修飾鍵?

if ((flags & someKeyMask) && (flags someOtherKeyMask)) 

這將匹配即使第三修改鍵是向下。 在if if條件中提前使用更長的一系列關鍵字掩碼使行爲按需要工作,但感覺不完整。是「只有這些修飾鍵,而不是其他」的好方法嗎?

這是一個更具體的例子,其中第一個匹配在其他之前。我想知道是否有一種方法可以爲每個說「只有這些修飾鍵」添加一些邏輯。

if ((flags & (NSCommandKeyMask|NSControlKeyMask))) { 
               NSLog(@"one"); 
              }else if (((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask)) && (flags & NSControlKeyMask)) { 
               NSLog(@"Command+Option+Control "); 
              } else if ((flags & NSCommandKeyMask) && (flags & NSShiftKeyMask)) { 
               NSLog(@"Command+Shift "); 
              } else if ((flags & NSCommandKeyMask) && (flags & NSControlKeyMask)) { 
               NSLog(@"Command+Control"); 
              } else if ((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask)) { 
               NSLog(@"Command+Option "); 
              } 

因此,作爲由Ken Thomases提供了正確的模式我一直在尋找,就是: flags &= (<one or more masks bitwise OR'd together); if (flags == (<one or more masks bitwise OR'd together)) { // do something }

這使獨家配套。

回答

6

首先,您需要知道從-modifierFlags返回的值包含一些標記,這些標記不完全對應於鍵。您應該構建一個包含您關心的所有標誌(不管您是否按下或不按下)的遮罩。通過該掩碼傳遞標誌值,然後將結果與您想要的組合進行比較。

例如,如果你關心命令,選項,Shift和控制,並且想知道是否準確指揮和轉移是下降,但其他人都沒有,你可以使用:

if ((flags & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)) == (NSShiftKeyMask|NSCommandKeyMask)) 
    // do something 

更新:以下是如何檢查的各種組合:

flags &= NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask; 
if (flags == (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)) 
    NSLogs(@"Command+Option+Control"); 
else if (flags == (NSShiftKeyMask|NSCommandKeyMask)) 
    NSLog(@"Command+Shift "); 
else if (flags == (NSControlKeyMask|NSCommandKeyMask)) 
    NSLog(@"Command+Control"); 
else if (flags == (NSAlternateKeyMask|NSCommandKeyMask)) 
    NSLog(@"Command+Option "); 
+0

是的,這樣做不是問題。問題是如果if(else {(flags&(NSShiftKeyMask | NSControlKeyMask))在if-else系列之前出現,它甚至會與相同的修改鍵序列相匹配 – uchuugaka 2013-02-10 12:09:41

+1

您應該只檢查所需的確切組合。如果你真的有兩個不相互排斥的條件,那麼你必須決定你想如何處理它(做兩個,只做A,只做B,不要做),並相應地編寫你的代碼。也許我不理解這聽起來像是一個老玩笑:「醫生,當我像這樣移動我的胳膊時,它會受傷。」「那麼,不要這樣做。」換句話說:所有的條件都應該是這樣的形式我已經顯示,沒有你寫的表格 – 2013-02-10 15:36:04

+0

我已經用一個類似於你的問題的擴展例子更新了我的答案(儘管你的問題有一個多餘的例子) – 2013-02-10 16:45:34

0

爲了趕只是同時按下,則需要使用開關/休息建設:

switch (flags) { 
      case (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask): 
       [keystrokes appendString:@"cmd-alt-ctrl-"]; 
       break; 
      case (NSShiftKeyMask|NSCommandKeyMask): 
       [keystrokes appendString:@"cmd-shift-"]; 
       break; 
      case (NSControlKeyMask|NSCommandKeyMask): 
       [keystrokes appendString:@"cmd-ctrl-"]; 
       break; 
      case (NSAlternateKeyMask|NSCommandKeyMask): 
       [keystrokes appendString:@"cmd-alt-"]; 
       break; 
      default: 
       break; 
     }