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

Sam*_*nia 5 unix keyboard macos mouse objective-c

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

Fee*_*Jai 4

我制作了一个小型开源应用程序,允许您CGEventTap使用 OS X 中的功能选择性地禁用键盘。它位于 Carbon Framework 内部,但基于 CoreFoundation,因此它也适用于 Lion。作为示例,您可以尝试我的开放式 SourceApp MultiLayout,可在 GitHub 上找到

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

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

#import <Carbon/Carbon.h>
Run Code Online (Sandbox Code Playgroud)

然后创建一个事件点击,如下所示:

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);

}
Run Code Online (Sandbox Code Playgroud)

要在必要时中断事件,请使用以下代码片段:

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;
}
Run Code Online (Sandbox Code Playgroud)

只需将布尔值设置dontForwardTap为 true,事件就会停止。