2011-07-21 7 views
5

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ę

+2

Prawdopodobny duplikat: http://stackoverflow.com/questions/4518559/consuming-osx-mouse-trackpad-events-with-an-event-tap –

+0

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

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.