2010-12-12 23 views
3

設置了事件水龍頭後,我無法確定在給定CGEvent時按了哪個修飾鍵。獲取在CGEvent水龍頭中按下的修改鍵

CGEventFlags flagsP; 

flagsP=CGEventGetFlags(event); 

NSLog(@"flags: 0x%llX",flagsP); 
NSLog(@"stored: 0x%llX",kCGEventFlagMaskCommand); 

if (flagsP==kCGEventFlagMaskCommand) { 
     NSLog(@"command pressed"); 
    } 

鑑於上面的代碼片段,第一個NSLog從第二個NSLog返回一個不同的值。毫不奇怪,按下命令修飾鍵時從不觸發條件。

我需要確定命令,備用,選項,控制或換班是否按下給定的CGEvent。首先,我需要幫助來理解爲什麼上述不起作用。

謝謝!

回答

6

這些是位掩碼,它們將按照從CGEventGetFlags(或自己創建事件時傳遞)中的值進行按位或運算。

您不能在此處測試相等性,因爲沒有單個位掩碼將等於多個位掩碼的組合。您需要測試一個位的相等性。

要從組合位掩碼中提取單個位掩碼的值,請使用按位與(&)運算符。然後,將其與您感興趣的單位掩碼進行比較:

BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand; 

爲什麼這兩個?

&表達式評估爲相同類型的操作數,這是在這種情況下,這可能不適合用BOOL的大小,這是一個signed charCGEventFlags==表達式將其解析爲1或0,這些都適合於BOOL

這一問題的其他解決方案包括否定值的兩倍(!!)和聲明變量如bool_Bool而非BooleanBOOL。 C99的_Bool類型(包含stdbool.h時與bool同義)強制其值爲1或0,正如==!!解決方案所做的一樣。

+0

謝謝彼得。這解釋得非常好,解決了我的問題。 – the979kid 2010-12-13 08:19:25

+0

非常感謝,你是否知道是否有辦法檢查是否有修飾符被按下?或者我必須爲每個人明確檢查一下嗎? – 2013-12-04 23:29:02

+0

我這樣做,但不知道它是最好的/最乾淨的方式? (BOOL isModifierPressed =(flags&(kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand | kCGEventFlagMaskControl | kCGEventFlagMaskShift))> 0; ' – 2013-12-04 23:49:47