Chciałbym programowo wyłączyć tymczasowo wejście klawiatury myszy & na mac (używając Objective C/C/Unix) &, a następnie włączyć je ponownie.Programowo wyłącz mysz i klawiaturę
5
A
Odpowiedz
4
Zrobiłem małą aplikację o otwartym kodzie źródłowym, która pozwala na selektywne wyłączanie klawiatur z funkcją CGEventTap
od OS X. Znajduje się wewnątrz Carbon Framework, ale w oparciu o CoreFoundation, więc działa również na Lionie. Jako przykład możesz wypróbować mój otwarty SourceApp MultiLayout, available here on GitHub.
zasadzie to, co trzeba zrobić, jeśli chcesz to zrobić samemu to:
Aby z niego skorzystać, trzeba dodać Framework węgla:
#import <Carbon/Carbon.h>
Następnie utwórz kran zdarzeń tak:
void tap_keyboard(void) {
CFRunLoopSourceRef runLoopSource;
CGEventMask mask = kCGEventMaskForAllEvents;
//CGEventMask mask = CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventKeyDown);
CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, mask, myCGEventCallback, NULL);
if (!eventTap) {
NSLog(@"Couldn't create event tap!");
exit(1);
}
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CFRelease(eventTap);
CFRelease(runLoopSource);
}
do przerwania zdarzenia, gdy to konieczne, należy użyć tego fragmentu:
bool dontForwardTap = false;
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
//NSLog(@"Event Tap: %d", (int) CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode));
if (dontForwardTap)
return nil;
else
return event;
}
Po prostu ustaw wartość boolean dontForwardTap
na wartość true, a zdarzenia zostaną zatrzymane.
Prawdopodobny duplikat: http://stackoverflow.com/questions/4518559/consuming-osx-mouse-trackpad-events-with-an-event-tap –
Inne rozwiązanie jest tutaj: http://stackoverflow.com/questions/5785630/modify-nsevent-to-send-a-different-key-than-one-that-was-pressed/5785895 # 5785895 – FeeJai