我是相当新的OSX的发展,所以这可能是容易的,但谷歌已经没有帮助。
我想绑定到媒体键您在新的Apple键盘(播放,暂停等)找到一个动作。 看来,你不能使用常规的热键API绑定到这些按键,但由于iTunes的明确管理它必须是可行的。 有没有达到这个棘手的一些未公开的API? 任何帮助将非常感激。
我是相当新的OSX的发展,所以这可能是容易的,但谷歌已经没有帮助。
我想绑定到媒体键您在新的Apple键盘(播放,暂停等)找到一个动作。 看来,你不能使用常规的热键API绑定到这些按键,但由于iTunes的明确管理它必须是可行的。 有没有达到这个棘手的一些未公开的API? 任何帮助将非常感激。
更广泛的谷歌搜索后,这http://www.rogueamoeba.com/utm/2007/09/29/似乎来解决这个问题。 有没有简单的解决方案,但如果你正在开发一个真正的可可应用程序,这似乎可能至少。
从我的调查,可用于其他进程之前,他们在操作系统捕捉这些关键事件。 我创建了一个CGEventTap,就像这样:
int main(int argc, char *argv[]) {
CFMachPortRef eventTap;
CFRunLoopSourceRef runLoopSource;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
if (!eventTap) {
NSLog(@"Couldn't create event tap!");
exit(1);
}
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CFRunLoopRun();
CFRelease(eventTap);
CFRelease(runLoopSource);
exit(0);
}
然后实际的事件回调是这样的:
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (type == kCGEventKeyUp) {
CGKeyCode keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
NSLog(@"%d", keycode);
}
return event;
}
你看到记录到控制台是,你得到的功能键正常登录方法(如果你按住“Fn”键也一样),但按媒体键,亮度,音量,或弹出键的时候, 什么都不是越来越记录。
因此,从这种情况,不幸的是似乎有没有办法捕捉的媒体键事件。 不过,我很乐意被证明是错误。
编辑:我忘了指出,对于这项工作,要么需要以root身份运行,或者您需要打开在系统偏好设置的“普遍可及”窗格中辅助设备的访问。