मैं अब कैसे एक निम्न स्तर पर हुक करने/ओएस एक्स पर टैप कीबोर्ड की घटनाओं की खोज की है: How to tap (hook) F7 through F12 and Power/Eject on a MacBook keyboardकैसे OSX में/हुक कुंजीपटल घटनाओं और रिकॉर्ड है जो कुंजीपटल आग दोहन करने के लिए प्रत्येक घटना
मुद्रण कि से कोड बाहर का जवाब:
// compile and run from the commandline with:
// clang -framework coreFoundation -framework IOKit ./HID.c -o hid
// sudo ./hid
// This code works with the IOHID library to get notified of keys.
// Still haven't figured out how to truly intercept with
// substitution.
#include <IOKit/hid/IOHIDValue.h>
#include <IOKit/hid/IOHIDManager.h>
void myHIDKeyboardCallback(void* context, IOReturn result, void* sender, IOHIDValueRef value)
{
IOHIDElementRef elem = IOHIDValueGetElement(value);
if (IOHIDElementGetUsagePage(elem) != 0x07)
return;
uint32_t scancode = IOHIDElementGetUsage(elem);
if (scancode < 4 || scancode > 231)
return;
long pressed = IOHIDValueGetIntegerValue(value);
printf("scancode: %d, pressed: %ld\n", scancode, pressed);
}
CFMutableDictionaryRef myCreateDeviceMatchingDictionary(UInt32 usagePage, UInt32 usage)
{
CFMutableDictionaryRef dict = CFDictionaryCreateMutable(
kCFAllocatorDefault, 0
, & kCFTypeDictionaryKeyCallBacks
, & kCFTypeDictionaryValueCallBacks);
if (! dict)
return NULL;
CFNumberRef pageNumberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, & usagePage);
if (! pageNumberRef) {
CFRelease(dict);
return NULL;
}
CFDictionarySetValue(dict, CFSTR(kIOHIDDeviceUsagePageKey), pageNumberRef);
CFRelease(pageNumberRef);
CFNumberRef usageNumberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, & usage);
if (! usageNumberRef) {
CFRelease(dict);
return NULL;
}
CFDictionarySetValue(dict, CFSTR(kIOHIDDeviceUsageKey), usageNumberRef);
CFRelease(usageNumberRef);
return dict;
}
int main(void)
{
IOHIDManagerRef hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
CFArrayRef matches;
{
CFMutableDictionaryRef keyboard = myCreateDeviceMatchingDictionary(0x01, 6);
CFMutableDictionaryRef keypad = myCreateDeviceMatchingDictionary(0x01, 7);
CFMutableDictionaryRef matchesList[] = { keyboard, keypad };
matches = CFArrayCreate(kCFAllocatorDefault, (const void **)matchesList, 2, NULL);
}
IOHIDManagerSetDeviceMatchingMultiple(hidManager, matches);
IOHIDManagerRegisterInputValueCallback(hidManager, myHIDKeyboardCallback, NULL);
IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeNone);
CFRunLoopRun(); // spins
}
मैं कैसे (शायद कि कोड अनुकूल करने के लिए) की पहचान जो कुंजीपटल एक विशेष घटना के लिए जिम्मेदार है सकते हैं?
उपयोग का मामला यह है कि मैं एक बाहरी कीबोर्ड का उपयोग करने की योजना बना रहा हूं जिसे रीमेप किया जाएगा, लेकिन साथ ही मेरे इनबिल्ट मैकबुक कीबोर्ड के लिए मूल मानचित्रण को बनाए रखा जाएगा।
संपादित करें:
OSX HID Filter for Secondary Keyboard?
https://github.com/candera/khordr/blob/master/src/c/keygrab/hid-scratch.c
http://ianjoker.googlecode.com/svn/trunk/Joker/Joker/hid_test.cpp
http://www.cplusplusdevelop.com/72_17345226/
http://www.cocoabuilder.com/archive/cocoa/229902-which-keyboard-barcode-scanner-did-the-event-come-from.html
उठा लेने के लिए धन्यवाद। मुझे 'प्रेषक' लॉगिंग करने का विचार करना चाहिए था। बस मेरे कोड उदाहरण के साथ कोशिश की, और यह वास्तव में एक अलग मूल्य देता है कि मैं किस कीबोर्ड का उपयोग कर रहा हूं (1800442080 इनबिल्ट, 1800440000 वायरलेस)। क्या मैं अपने कीबोर्ड को इस तरह से समझा सकता हूं कि मैं इनबिल्ट कीबोर्ड के लिए संबंधित आईडी प्राप्त कर सकता हूं? –
ध्यान दें कि आप 'IOHIDManagerRegisterInputValueCallback' का उपयोग कर रहे हैं, जबकि मैं सुझाव दे रहा हूं [' IOHIDDeviceRegisterInputValueCallback'] (https://developer.apple.com/library/mac/documentation/IOKit/Reference/IOHIDDevice_iokit_header_reference/index.html#// apple_ref/c/func/IOHIDDeviceCopyMatchingElements) - सूक्ष्म लेकिन महत्वपूर्ण अंतर। मैं एचआईडी डिवाइस गणना पर कुछ और विवरण के साथ जवाब अपडेट कर दूंगा। – pmdj
आप कहते हैं कि मेरे वर्तमान ('IOHIDManagerRegisterInputValueCallback') के साथ स्थापित किया गया है कि 'प्रेषक' छुपा प्रबंधक संदर्भ होगा। लेकिन यह वास्तव में प्रत्येक कीबोर्ड के लिए अलग-अलग रिपोर्ट करता है, जो अन्यथा सुझाव देता है, क्योंकि केवल एक प्रबंधक है। इससे मुझे आश्चर्य होता है कि किसी विशेष डिवाइस के लिए कॉलबैक सेट करना वास्तव में आवश्यक है। –