【发布时间】:2019-10-03 01:46:42
【问题描述】:
有没有办法获取当前系统上所有 NSPasteBoard 及其名称的列表?
我想知道是否有一些可用的功能(即使是私有 API)来实现这一点。谢谢!
【问题讨论】:
标签: macos cocoa nspasteboard
有没有办法获取当前系统上所有 NSPasteBoard 及其名称的列表?
我想知道是否有一些可用的功能(即使是私有 API)来实现这一点。谢谢!
【问题讨论】:
标签: macos cocoa nspasteboard
不,没有功能可以做到这一点,即使使用私有 API。
pboard 程序 (/usr/libexec/pboard) 作为守护进程运行并管理所有共享的粘贴板。 NSPasteboard 类使用 XPC 与 pboard 守护进程对话,因此要获取所有粘贴板的列表,pboard 需要通过响应粘贴板名称列表来处理一些 XPC 消息。
pboard 程序非常简单:它初始化各种东西(日志、沙箱、调度队列、mach 服务)然后调用__CFPasteboardStartServicingConnection,这实际上是在 CoreFoundation 框架中定义的。这个函数最终通过调用_CFHandlePasteboardXPCEvent来处理每个传入的XPC请求。
在反汇编器中查看_CFHandlePasteboardXPCEvent(我使用了Hopper),我们可以看到pboard支持的完整请求列表:
com.apple.pboard.create
com.apple.pboard.get-counts
com.apple.pboard.barrier
com.apple.pboard.begin-generation
com.apple.pboard.has-entries
com.apple.pboard.register-entries
com.apple.pboard.request-data
com.apple.pboard.refresh-cache
com.apple.pboard.release
com.apple.pboard.unique-promise-file
com.apple.pboard.resolve-all-promises
com.apple.pboard.resolve-pboard-promises
com.apple.pboard.set-data-flags
com.apple.pboard.make-generation-local
这些都没有像com.apple.pboard.get-pboard-names 这样明显的名称。看看它们是如何处理的,几乎所有人做的第一件事就是从事件中获取一个粘贴板名称,然后查找或创建具有该名称的粘贴板。
我发现唯一不涉及按名称查找粘贴板的请求是com.apple.pboard.resolve-all-promises,它实际上发送了有趣的消息+[_CFPasteboardStore copyAllPasteboards]。但是,据我所知,它不会将结果或实际上任何结果发送回客户端。这是 CoreFoundation 中 copyAllPasteboards 选择器的唯一用途。
因此,除非您使用调试器附加到 pboard 守护程序并四处寻找,否则您不会找到所有现有粘贴板的列表。 (使用调试器连接到 pboard 需要首先禁用 SIP,这需要启动您的恢复分区。)
【讨论】: