我正在从 Logitech G13 键盘读取按键,需要将它们发送到已知的应用程序。看来我应该使用 CGEventPostToPSN 方法来发送击键。我的问题是我需要 PSN,但我在 Stackoverflow 中找到的所有解决方案都使用 GetNextProcess 对进程进行迭代,而且它似乎已被弃用。
如果知道应用程序的名称或路径,是否可以从进程中获取 PSN?
或者是否有其他方式将击键发送到外部应用程序?我可以想象在任何情况下我都需要 PSN 或进程的 pid。
如果能得到它的 Objective C 代码那就太好了。
要获取 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 年多了!但它仍然工作得很好。我希望它能继续发挥作用。