以编程方式禁用鼠标&键盘

时间:2011-07-21 13:15:58

标签: objective-c macos unix keyboard mouse

我想以编程方式禁用鼠标&键盘输入临时在mac上(使用Objective C / C / Unix)&然后重新启用它们。

1 个答案:

答案 0 :(得分:4)

我创建了一个小型开源应用程序,允许您从OS X中选择性地禁用具有CGEventTap功能的键盘。它位于Carbon Framework内部,但基于CoreFoundation,因此它也适用于Lion。 例如,您可以尝试我的开源SourceApp MultiLayout, available here on GitHub

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

要使用它,您需要添加Carbon Framework:

#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,即可停止事件。