2011-03-03 2 views
2

단축키를 통해이 기능 중 하나를 지원하는 데스크톱 응용 프로그램을 개발 중입니다. 이 기능을 사용하려면 이벤트 탭을 사용하고 있습니다.핫 키 콜백에 대한 이벤트 탭 (CFMachPortRef) 문제가 발생하지 않습니다.

하지만 때로는 (임의적으로) 콜백이 호출되지 않습니다. 단축키가 작동하지 않아 기능이 작동하지 않는 것 같습니다.

누군가 나를 문제 해결에 도움이 될 수 있습니까?

-(void)startEventTapinThread //Called in a separate thread. 
{ 
    NSAutoreleasePool *pool =[ [ NSAutoreleasePool alloc] init]; 

    CFRunLoopRef runloop =(CFRunLoopRef)CFRunLoopGetCurrent(); 
    CGEventMask interestedEvents = CGEventMaskBit(kCGEventFlagsChanged)|CGEventMaskBit(kCGEventKeyDown); 
    CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, interestedEvents, myCGEventCallback, self); //self is the object pointer our method 
    CFRunLoopSourceRef source = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0); 
    CFRunLoopAddSource((CFRunLoopRef)runloop , source, kCFRunLoopCommonModes); 
    CFRunLoopRun(); 
    [ pool release]; 
} 

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) 
{ 
    CGEventType eventType = CGEventGetType(event); 
    //execute the code related to feature 
} 
+1

몇 시간 동안 디버깅 한 후에 myCGEventCallback이 kCGEventFlagsChanged에 대해서만 호출되었음을 알았습니다. kCGEventKeyDown에 대해서만 호출되는 것은 아닙니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? – spd

답변

1

I 이벤트 kCGEventMaskForAllEvents를 전달하기보다는 특정 이벤트에 대한 후크를 설정합니다 : 다음

코드 조각입니다.

그런 다음 콜백 함수에서 이벤트를 필터링하십시오.

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) 
{ 

if (type == kCGEventTapDisabledByTimeout) { 
    NSLog(@"Event Taps Disabled! Re-enabling"); 
    CGEventTapEnable(eventTap, true); 
    return event; 
} 

if (type == kCGEventLeftMouseDown) { 
    //... 
} 

if (type != kCGEventKeyDown) { 
    //... 
} 

if (type == kCGEventKeyDown) { 
    //... 
} 
+0

내가 이것을 시도하고 여기에 출력을 게시하자 :) – spd

0

문제의 해결책은 this question의 가장 큰 답변에 설명되어 있습니다. 내가 그렇게 할 대표 점수를 가지고 있다면 나는이 질문을 속임수로 표시 할 것이다.

관련 문제