मेरी जांच से, ऑपरेटिंग सिस्टम अन्य प्रक्रियाओं के लिए उपलब्ध होने से पहले उन महत्वपूर्ण घटनाओं को फँस रहा है। मैं एक 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;
}
क्या आप कंसोल के लिए लॉग इन देखते हैं कि आप सामान्य लॉग तरीकों मिलता है फ़ंक्शन कुंजियों के लिए (यदि आप "एफएन" कुंजी को भी दबा रहे हैं), लेकिन मीडिया कुंजी, चमक, वॉल्यूम, या एक्जेक्ट कुंजियों को दबाते समय, कुछ भी नहीं लॉग हो रहा है।
तो इससे दुर्भाग्यवश ऐसा लगता है कि मीडिया कुंजी ईवेंट को कैप्चर करने का कोई तरीका नहीं है। हालांकि, मुझे गलत साबित होना अच्छा लगेगा।
संपादित करें: मैं यह इंगित करना भूल गया कि इसे काम करने के लिए या तो रूट के रूप में चलाने की आवश्यकता है, या आपको सिस्टम प्राथमिकताओं के "सार्वभौमिक पहुंच" फलक में सहायक उपकरणों तक पहुंच चालू करने की आवश्यकता है।
समस्या यह है कि आईट्यून्स को इन चाबियों से प्रतिक्रिया करने से रोकने का कोई तरीका नहीं है - जो आपके एप्लिकेशन को नियंत्रित करने के लिए इन चाबियों का उपयोग करने के लिए मूर्खतापूर्ण बनाता है। – adib