2011-01-17 7 views
0

키보드 이벤트를 가로 채서 데모 앱을 성공적으로 가져 왔습니다. 여기에 대한 핸들러가 있습니다.CGEventRef가 어떤 응용 프로그램에서 왔는지 어떻게 알 수 있습니까?

CGEventRef keyUpCallback (CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) { 
    NSLog(@"KeyUp event tapped!"); 
    return; 
} 

이벤트를 보낸 응용 프로그램에 따라 다른 작업을 수행하려고합니다. 어떤 응용 프로그램인지 어떻게 알 수 있습니까?

답변

2

키 입력을받는 응용 프로그램은 아마도 활성 응용 프로그램이므로, 어떤 응용 프로그램이 활성 상태인지에 따라 이벤트를 다르게 처리 할 수 ​​있습니다. 활성 응용 프로그램의 이름을 얻으려면 NSWorkspaceactiveapplication 메서드를 사용할 수 있습니다.

활성 응용 프로그램을 가져 오는 방법은 this thread도 참조하십시오. 어떻게되는지 여기

NSLog(@"Target PID:%lld",CGEventGetIntegerValueField(event, kCGEventTargetUnixProcessID)); 
+3

또한 응용 프로그램에서 이벤트를 보내지 않았습니다. 어떤 종류의 키보드가 이벤트를 보냈습니다. 신청서 *는 해당 일정을받습니다. 응용 프로그램이 이벤트를 구성하여 큐에 게시 할 수도 있지만이 경우에는 위조 된 것과 동일한 속성을 가진 실제 이벤트와 다르게 처리 할 수 ​​있습니다. 어쨌든, 어떤 응용 프로그램 (있는 경우)이 이벤트를 작성하고 게시했는지 말할 수 없습니다. –

+0

합병증이 있습니다. 활성화되지 않은 패널과 같은 것이 있습니다 (['NSNonactivatingPanelMask'] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSPanel_Class/Reference 참조). /Reference.html#//apple_ref/doc/uid/20000244-SW10)). 따라서 "키"상태 (포커스)가있는 앱이 활성화되지 않았을 수 있습니다. 어떤 응용 프로그램이 실제로 그 경우에 초점을 가지고 있는지 알아내는 방법을 모르겠습니다. –

0

이 이벤트를 보내는 응용 프로그램의 프로세스 ID를 보여줍니다.

예를 들어 가상 키보드를 열고 가상 키보드를 사용하여 이벤트를 보낼 수 있습니다. 가상 키보드는 사용자 공간에서 프로세스이므로 사용자는 키보드를 processIdSource과 같이 처리합니다. 하지만 대부분의 경우 0processIdSource으로 표시됩니다.

응용 프로그램의 pid를 얻은 후에 NSRunningApplication 인스턴스를 만들고 정보를 얻을 수 있습니다.

1

:

int64_t processIdTarget = CGEventGetIntegerValueField(event, kCGEventTargetUnixProcessID); 
int64_t processIdSource = CGEventGetIntegerValueField(event, kCGEventSourceUnixProcessID); 

processIdSource는 응용 프로그램의 송신자와 수신자에 대한 processIdTarget 스탠드를 보여줍니다

관련 문제