2011-03-03 31 views
2

我正在開發一個桌面應用程序,通過熱鍵支持其中一項功能。我正在使用Event Tap來運作。熱鍵回調事件點擊(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 2011-03-28 06:21:22

回答

1

我會通過事件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 2011-09-14 03:39:29

0

你的問題的解決方案是最多的回答最有可能的描述this question。如果我有rep分數的話,我會把這個問題標記爲一個騙局。