Sam*_*nia 5 unix keyboard macos mouse objective-c
我想以编程方式在mac上暂时禁用鼠标和键盘输入(使用Objective C/C/Unix),然后重新启用它们.
我制作了一个小型开源应用程序,允许您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,事件就会停止。