绑定到OSX 10.5下Apple键盘上的媒体键

时间:2009-06-27 18:08:30

标签: cocoa macos media hotkeys

我对OSX开发相当新,所以这可能很容易,但谷歌没有帮助。

我正在尝试将动作绑定到您在较新的Apple键盘上找到的媒体键(播放,暂停等)。您似乎无法使用常规热键API绑定到这些键,但必须可以,因为iTunes明确管理。是否有一些棘手的未记录的API实现了这一目标?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

根据我的调查,操作系统会捕获这些关键事件,然后才能将其用于其他进程。我创建了一个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身份运行,要么需要在“系统偏好设置”的“通用访问”窗格中打开辅助设备的访问权限。