OSX 10.5下结合于Apple键盘媒体键[关闭](Binding to Media keys o

2019-06-24 07:54发布

我是相当新的OSX的发展,所以这可能是容易的,但谷歌已经没有帮助。

我想绑定到媒体键您在新的Apple键盘(播放,暂停等)找到一个动作。 看来,你不能使用常规的热键API绑定到这些按键,但由于iTunes的明确管理它必须是可行的。 有没有达到这个棘手的一些未公开的API? 任何帮助将非常感激。

Answer 1:

更广泛的谷歌搜索后,这http://www.rogueamoeba.com/utm/2007/09/29/似乎来解决这个问题。 有没有简单的解决方案,但如果你正在开发一个真正的可可应用程序,这似乎可能至少。



Answer 2:

从我的调查,可用于其他进程之前,他们在操作系统捕捉这些关键事件。 我创建了一个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身份运行,或者您需要打开在系统偏好设置的“普遍可及”窗格中辅助设备的访问。



文章来源: Binding to Media keys on Apple keyboards under OSX 10.5 [closed]