我如何知道 CGEventRef 来自哪个应用程序?

发布于 2024-10-12 01:19:02 字数 261 浏览 7 评论 0原文

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

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

我想根据发送事件的应用程序执行不同的操作。我如何知道它是哪个应用程序?

I've successfully got a demo app intercepting keyboard events. Here's the handler for them.

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

I want to do different things depending on which application sent the event. How can I tell which application it is?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

無處可尋 2024-10-19 01:19:02

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

另请参阅 这个线程是关于获取活动应用程序的。

The application that is receiving keystrokes is presumably the active application, so you could handle the event differently depending on which application is active. You can use the activeapplication method from NSWorkspace to get the name of the active application.

See also this thread about getting the active application.

梦在深巷 2024-10-19 01:19:02

具体流程如下:

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

processIdSource 显示应用程序发送方,processIdTarget 代表接收方。

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

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

Here how it goes:

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

processIdSource shows you application sender and processIdTarget stands for receiver.

For example you can open virtual keyboard and send events with it. As virtual keyboard is process in user space you will get it's pid as processIdSource. But for most of cases you will get 0 as processIdSource.

After you got application's pid you can create NSRunningApplication instance and get bunch of information from it.

回忆追雨的时光 2024-10-19 01:19:02

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

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

This shows process ID of the application that sent the event:

NSLog(@"Target PID:%lld",CGEventGetIntegerValueField(event, kCGEventTargetUnixProcessID));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文