2011-07-21 50 views
5

我想以編程方式禁用鼠標&暫時在mac上使用鍵盤輸入(使用Objective C/C/Unix)&然後重新啓用它們。以編程方式禁用鼠標和鍵盤

+2

可能的重複:http://stackoverflow.com/questions/4518559/consuming-osx-mouse-trackpad-events-with-an-event-tap –

+0

另一個解決方案是在這裏:http://stackoverflow.com/questions/5785630 /修改 - nsevent待送-A-不同的琴鍵比最一說,被壓/ 5785895#5785895 – FeeJai

回答

4

我已經制作了一個小型的開放源碼應用程序,允許您通過OS X的CGEventTap函數選擇性地禁用鍵盤。它位於Carbon Framework內部,但基於CoreFoundation,因此它也適用於Lion。 作爲一個例子,你可以嘗試我的開放SourceApp MultiLayout, available here on GitHub

基本上你需要做什麼,如果你想自己做的是:

#import <Carbon/Carbon.h> 

然後創建一個事件自來水是這樣的:

要,你需要添加碳框架使用它:

void tap_keyboard(void) { 
    CFRunLoopSourceRef runLoopSource; 

    CGEventMask mask = kCGEventMaskForAllEvents; 
    //CGEventMask mask = CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventKeyDown); 

    CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, mask, myCGEventCallback, NULL); 

    if (!eventTap) { 
     NSLog(@"Couldn't create event tap!"); 
     exit(1); 
    } 

    runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0); 

    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); 

    CGEventTapEnable(eventTap, true); 

    CFRelease(eventTap); 
    CFRelease(runLoopSource); 

} 

要中斷的事件,必要時,使用此片段:

bool dontForwardTap = false; 

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


    //NSLog(@"Event Tap: %d", (int) CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode)); 

    if (dontForwardTap) 
     return nil; 
    else 
     return event; 
} 

只需將布爾dontForwardTap設置爲true,並且事件將被停止。