2012-07-11 57 views
0

我可以通過下面的說明安裝系統範圍內的鍵盤顯示器內部流程監控鍵盤事件:(過程廣角)

CGEventRef eventCallback(CGEventTapProxy proxy, CGEventType type, 
    CGEventRef event, void *userData) 
{ 
} 

CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, 
    kCGHeadInsertEventTap, kCGEventTapOptionDefault, 
    kCGEventKeyDown, 
    &eventCallback, 
    NULL); 
if(eventTap) 
{ 
    CFRunLoopSourceRef eventRunLoopSourceRef = 
     CFMachPortCreateRunLoopSource(NULL, eventTap, 0); 
    CFRelease(eventTap); 
    CFRunLoopAddSource(CFRunLoopGetCurrent(), eventRunLoopSourceRef, 
     kCFRunLoopDefaultMode); 
    CFRelease(eventRunLoopSourceRef); 
} 

這段代碼的缺點是,它需要在「系統偏好設置激活「全面普及」 「並監視所有進程(我不需要它)。

我想監視我的進程內部的鍵盤事件。它是如何可能的,是否需要激活「通用訪問」?謝謝。

回答

4

我想你想NSEventaddLocalMonitorForEventsMatchingMask:handler:

self.eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask 
    handler:^(NSEvent *event) { 
     NSLog(@"keyDown event!"); 
     return event; 
    }]; 

the docs。這並不需要啓用Universal Access。

+0

如果我沒有訪問「自我」,會發生什麼?我已經寫了一個注入到其他進程中的dylib,在InDesign這樣的碳應用程序中,我使用Carbon Events並且沒有問題,但是在像TextEdit這樣的可可應用程序中,如何在dylib中使用您的方法? – 2012-07-22 10:36:10

+0

addLocalMonitorForEventsMatchingMask:處理程序:返回一個ID,您需要將它保存在某處,以便稍後可以刪除監視器(使用removeMonitor :)。在我的例子中,我將它作爲一個類的一個屬性,但它不一定是。 – zpasternack 2012-07-22 18:47:16

2

如果您不必監視其他進程,那麼您應該可以使用普通事件來查看鍵盤。在Carbon中,安裝kEventRawKeyDown(比如說)kEventClassKeyboard的處理程序,例如

。在應用程序或窗口級別。

在可可,實現keyDown:或者您需要對NSResponder一個子類,如您NSApplication子類或特定NSWindow子類任何方法。

+0

如果我沒有訪問NSApplication會發生什麼?我已經寫了一個注入其他進程的dylib,在InDesign這樣的碳應用程序中,我使用Carbon Events並且沒有問題,但是在像TextEdit這樣的可可應用程序中,我如何實現keyDown:在dylib中? – 2012-07-22 10:34:35

1

在可可,我想你想要NSApplication的子類並重寫-[NSApplication sendEvent:]

+0

如果我沒有訪問「NSApplication」會怎麼樣?我已經寫了一個注入其他進程的dylib,在InDesign這樣的碳應用程序中,我使用Carbon Events並且沒有問題,但是在像TextEdit這樣的可可應用程序中,如何監控dylib中的keydown? – 2012-07-22 10:39:40

2
ProcessSerialNumber psn = { 0 }; 
GetCurrentProcess(& psn); 
CGEventTapCreateForPSN(& psn, ...); 

這是僅適用於當前的進程,而不是整個系統的監聽事件的過程中,廣泛的方式。

+0

我還沒有測試過,但它似乎是一個非常好的答案。謝謝。 – 2013-03-13 06:27:39