2009-06-27 13 views
6

के तहत ऐप्पल कीबोर्ड पर मीडिया कुंजी के लिए बाध्यकारी मैं ओएसएक्स विकास के लिए बिल्कुल नया हूं, इसलिए यह आसान हो सकता है लेकिन Google सहायक नहीं रहा है।ओएसएक्स 10.5

मैं मीडिया कुंजी आप नए एप्पल कीबोर्ड (प्ले, पॉज़, आदि) पर लगाने के लिए एक कार्रवाई बाध्य करने के लिए कोशिश कर रहा हूँ। ऐसा प्रतीत होता है कि आप नियमित हॉटकी एपीआई का उपयोग करके इन चाबियों से जुड़ नहीं सकते हैं, लेकिन आईट्यून्स स्पष्ट रूप से प्रबंधित होने के बाद से यह संभव होना चाहिए। क्या कुछ मुश्किल अनियंत्रित एपीआई है जो इसे प्राप्त करती है? कोई भी सहायताकाफी प्रशंसनीय होगी।

उत्तर

7

अधिक व्यापक googling के बाद, यह http://www.rogueamoeba.com/utm/2007/09/29/ इस मुद्दे को हल करने लगता है। कोई आसान समाधान नहीं है लेकिन यदि आप असली कोको ऐप विकसित कर रहे हैं तो यह कम से कम संभव लगता है।

+0

समस्या यह है कि आईट्यून्स को इन चाबियों से प्रतिक्रिया करने से रोकने का कोई तरीका नहीं है - जो आपके एप्लिकेशन को नियंत्रित करने के लिए इन चाबियों का उपयोग करने के लिए मूर्खतापूर्ण बनाता है। – adib

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; 
} 

क्या आप कंसोल के लिए लॉग इन देखते हैं कि आप सामान्य लॉग तरीकों मिलता है फ़ंक्शन कुंजियों के लिए (यदि आप "एफएन" कुंजी को भी दबा रहे हैं), लेकिन मीडिया कुंजी, चमक, वॉल्यूम, या एक्जेक्ट कुंजियों को दबाते समय, कुछ भी नहीं लॉग हो रहा है।

तो इससे दुर्भाग्यवश ऐसा लगता है कि मीडिया कुंजी ईवेंट को कैप्चर करने का कोई तरीका नहीं है। हालांकि, मुझे गलत साबित होना अच्छा लगेगा।

संपादित करें: मैं यह इंगित करना भूल गया कि इसे काम करने के लिए या तो रूट के रूप में चलाने की आवश्यकता है, या आपको सिस्टम प्राथमिकताओं के "सार्वभौमिक पहुंच" फलक में सहायक उपकरणों तक पहुंच चालू करने की आवश्यकता है।

+0

यह भी निष्कर्ष है कि मैं आया, हालांकि आईट्यून्स स्पष्ट रूप से इसमें शामिल हो रहा है जब तक कि कर्नेल में कहीं भी गहरी आईट्यून्स के लिए हार्डकोड अपवाद न हो? मुझे लगता है कि अजीब ... – tryx