2013-10-25 2 views
4

Mac 응용 프로그램의 Objective-C에서 지정된 단축키를 가로 채고 변경/무시하는 방법이 있습니까?키보드 단축키 (예 : CMD + q) 차단/비활성화

예를 들어 BetterTouchTool은 사용자가 제공하는 모든 바로 가기를 재정의 할 수 있습니다.

는 내가하고 싶은 것은 바로 가기를 '종료'방지 (즉 CMD + Q) 특정 응용 프로그램이 인스턴스에 바로 가기가 우발적으로 누르면 때문에 (열려 있고 어떤 사람들을 위해 바람직하지 않은 응용 프로그램을 닫습니다).

요약하면 글로벌 키 이벤트를 수신 한 다음 을 변경하기 전에이 해당 응용 프로그램에 전달 될 수 있습니까? 의 modifierFlagskeyCode 특성이있는 구문 분석 NSEvent에

static CGEventRef KeyDownCallback(CGEventTapProxy proxy, 
           CGEventType type, 
           CGEventRef event, 
           void *refcon) 
{ 
    /* Do something with the event */ 
    NSEvent *e = [NSEvent eventWithCGEvent:event]; 
    return event; 
} 

:

+0

완전히 프로그래밍되지 않은 솔루션으로, 시스템 환경 설정> 키보드> 키보드 단축키> 응용 프로그램 바로 가기> [특정 응용 프로그램]에서 해당 응용 프로그램에 해당하는 키를 변경할 수 있습니다 (이것은 Mavericks에서 옮겼습니다. 여전히 시스템 환경 설정에 있어야합니다.) 예를 들어 브라우저의 Quit 메뉴 항목을^⌥⌘Q로 설정했습니다. 코딩 방식으로 CGEventTaps를 찾고 있습니다. –

+0

응용 프로그램이 bash 스크립트를 사용하여 시작되고 * .app 응용 프로그램이 아니기 때문에 이는 작동하지 않습니다. CGEventTaps를 살펴 보겠습니다. 즉각적인 리소스가 있습니까? – ehftwelve

+0

잡담. [Quartz Event Services 참고서] (https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html)는 공식 문서입니다. –

답변

5

여기에 설정하는 방법 이벤트 리스너 여기에

CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, 
           kCGHeadInsertEventTap, 
           kCGEventTapOptionDefault, 
           CGEventMaskBit(kCGEventKeyDown), 
           &KeyDownCallback, 
           NULL); 

CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(NULL, eventTap, 0); 
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); 
CFRelease(runLoopSource); 
CGEventTapEnable(eventTap, true); 

그리고는 "콜백"입니다에 있습니다. keyCode은 누른 키의 코드이고 modifierFlags은 눌려진 다른 수정 자입니다 (Shift, Alt/Option, Command 등).

KeyDownCallback 이벤트에서 전파를 막는 방법은 return NULL;입니다.

참고 : 이벤트 탭 타이밍에 문제가있는 것 같습니다.이 문제를 해결하려면 이벤트 탭을 '재설정'할 수 있습니다. CGEventType type 좋아해서 kCGEventTapDisabledByTimeout 경우 KeyDownCallback 방법에

확인 : Reset eventTap이고

if (type == kCGEventTapDisabledByTimeout) 
{ 
    /* Reset eventTap */ 
    return NULL; 
} 

하고, 다시 상기 이벤트 리스너의 설정을 실행한다.