2010-12-12 6 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에서 수신 한 값 (또는 직접 이벤트를 생성 할 때 전달)으로 비트 단위 OR 연산됩니다.

단일 비트 마스크가 여러 비트 마스크의 조합과 같지 않으므로 여기에서는 동등성을 테스트 할 수 없습니다. 단일 비트의 동등성을 테스트해야합니다.

결합 된 비트 마스크에서 단일 비트 마스크 값을 추출하려면 bitwise-AND (&) 연산자를 사용하십시오. 그런 다음 관심있는 단일 비트 마스크와 비교하십시오.

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

왜 둘 모두입니까?

& 식은 signed charBOOL의 사이즈에 맞지 않을 수 있으므로 이러한 경우에 피연산자 CGEventFlags이다,와 같은 형태로 평가. == 표현식은 그 값을 1 또는 0으로 해석합니다. 이는 모두 BOOL에 맞을 것입니다. 그 문제

다른 솔루션 회 (!!) 값을 부정하고 bool 또는 _Bool보다는 Boolean 또는 BOOL 같이 변수를 선언 포함한다. C99의 _Bool 유형 (stdbool.h를 포함 할 때 bool과 동의어)은 ==!! 솔루션과 마찬가지로 값이 1 또는 0이되도록합니다.

+0

감사합니다. 그것은 그것을 아주 잘 설명하고 나의 문제를 해결합니다. – the979kid

+0

수정자를 눌렀는지 확인하는 방법이 있다면 정말 고마워요? 아니면 각각에 대해 이렇게 명시 적으로 확인해야합니까? –

+0

나는 이것을했다. 그러나 그것이 가장 좋은/가장 깨끗한 길인지에 관해 모른다? 'BOOL isModifierPressed = (플래그 & (kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand | kCGEventFlagMaskControl | kCGEventFlagMaskShift))> 0; ' –

관련 문제