2011-07-21 20 views
5

Fare & klavye girişini geçici olarak bir makroda (Objective C/C/Unix kullanarak) & programlanmadan devre dışı bırakmak ve yeniden etkinleştirmek istiyorum.Programsal Olarak Devre Dışı Bırak Fare ve klavye

+2

Olası kopya: http://stackoverflow.com/questions/4518559/consuming-osx-mouse-trackpad-events-with-an-event-tap –

+0

Başka bir çözüm de burada: http://stackoverflow.com/questions/5785630/değiştirme-nsevent-to-send-a-farklı anahtar-daha-tek-o-preslenmiş edildi/5785895 # 5785895 – FeeJai

cevap

4

OS X'den CGEventTap işleviyle klavyeleri seçici olarak devre dışı bırakmanızı sağlayan küçük bir açık kaynak uygulaması oluşturdum. Bu, Karbon Çerçevenin içinde, ancak CoreFoundation'ı temel alarak, aynı zamanda Lion üzerinde de çalışıyor. Örnek olarak açık SourceApp MultiLayout, available here on GitHub'u deneyebilirsiniz.

Temelde kendiniz yapmak istiyorsanız yapmanız gereken şudur:

#import <Carbon/Carbon.h> 

Sonra böyle bir olay musluğu oluşturmak: Eğer Karbon Framework eklemem gerekiyor

kullanmak için:

: gerekirse, bu pasajını kullandığınızda
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); 

} 

olayları kesmek için

Boolean dontForwardTap öğesini true olarak ayarlayın ve olaylar durdurulacaktır.