如何判断CGEventRef来自哪个应用程序?

时间:2011-01-17 02:24:13

标签: objective-c cocoa macos macos-carbon

我成功获得了一个拦截键盘事件的演示应用。这是他们的处理程序。

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

我想根据发送事件的应用程序做不同的事情。我怎么知道它是哪个应用程序?

3 个答案:

答案 0 :(得分:2)

接收击键的应用程序可能是活动应用程序,因此您可以根据活动的应用程序以不同方式处理事件。您可以使用NSWorkspace中的activeapplication方法获取活动应用程序的名称。

另请参阅this thread有关获取活动应用程序的信息。

答案 1 :(得分:1)

这是怎么回事:

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

processIdSource显示应用程序发件人,processIdTarget代表接收者。

例如,您可以打开虚拟键盘并使用它发送事件。由于虚拟键盘在用户空间中处理,因此您将获得它作为processIdSource的pid。但是对于大多数情况,您将获得0 processIdSource

获得应用程序的pid后,您可以创建NSRunningApplication实例并从中获取大量信息。

答案 2 :(得分:0)

显示发送事件的应用程序的进程ID:

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