2009-06-27 38 views
6

我對OSX開發相當新,所以這可能很簡單,但谷歌並沒有幫助。在OSX 10.5下綁定到Apple鍵盤上的媒體密鑰

我在嘗試將動作綁定到在較新的Apple鍵盤上播放的媒體鍵(播放,暫停等)。看起來,您無法使用常規熱鍵API綁定到這些鍵,但它必須可能,因爲iTunes可以明確管理。是否有一些棘手的未公開的API來實現這一點?任何幫助將非常感激。

回答

7

經過更廣泛的搜索後,http://www.rogueamoeba.com/utm/2007/09/29/似乎解決了這個問題。有沒有簡單的解決方案,但如果你正在開發一個真正的可可應用程序,至少這似乎是可能的。

+0

問題是,沒有辦法阻止iTunes從這些鍵反應 - 這使得使用這些鍵控制應用程序變得不明智。 – adib 2011-11-18 17:11:29

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」鍵),但按下媒體鍵,亮度,音量或彈出鍵時,沒有任何正在記錄。

因此,不幸的是,似乎沒有辦法捕獲媒體按鍵事件。但是,我很想被證明是錯誤的。

編輯:我忘了指出,爲此工作,它需要以超級用戶身份運行,或者您需要打開系統偏好設置的「通用訪問」窗格中輔助設備的訪問權限。

+0

這也是我得出的結論,不過iTunes明確地將它掛鉤了,除非在內核深處有iTunes的硬編碼異常?我會發現奇怪的... – tryx 2009-06-30 07:26:41