MacOS下如何获取外部进程的进程序列号?

问题描述 投票:0回答:1

我正在从 Logitech G13 键盘读取按键,需要将它们发送到已知的应用程序。看来我应该使用 CGEventPostToPSN 方法来发送击键。我的问题是我需要 PSN,但我在 Stackoverflow 中找到的所有解决方案都使用 GetNextProcess 对进程进行迭代,而且它似乎已被弃用。

如果知道应用程序的名称或路径,是否可以从进程中获取 PSN?

或者是否有其他方式将击键发送到外部应用程序?我可以想象在任何情况下我都需要 PSN 或进程的 pid。

如果能得到它的 Objective C 代码那就太好了。

objective-c macos
1个回答
0
投票

要获取 PSN,您可以使用 HIServices 框架中的

OSStatus GetProcessForPID(pid_t pid, ProcessSerialNumber *psn)
。它已被弃用多年,但仍然运行良好。

在较新的 API 中,有

LSASN
(LS 代表 LaunchServices,我不知道 ASN 是什么意思)。尽管名称不同,但它与 ProcessSerialNumber 完全相同,并且可以互换使用。

NSRunningRunningApplication
有一个私有
_asn
字段,其中包含 LSASN。但它被包裹在一个不透明的 CFType 中,除了解析
CFCopyDescription()
的结果之外,我不知道如何提取内容。获取 ASN 的其他方法是
lsappinfo
命令行工具或私有 LaunchServices API。但这些方法都不是很好。

我会坚持使用

GetProcessForPID()
,直到它从系统中删除。自 macOS 10.10(于 2014 年底发布)以来,它已被弃用 - 距今已有 9 年多了!但它仍然工作得很好。我希望它能继续发挥作用。

© www.soinside.com 2019 - 2024. All rights reserved.