列出 macOS 上的所有 NSPasteBoard 名称

tam*_*een 1 macos cocoa nspasteboard

有没有办法获得当前系统上所有 NSPasteBoard 及其名称的列表?

我想知道是否有一些可用的功能(即使是私有 API)来实现这一点。谢谢!

rob*_*off 5

不,即使使用私有 API,也没有执行此操作的功能。

pboard 程序 ( /usr/libexec/pboard) 作为守护程序运行并管理所有共享的粘贴板。这NSPasteboard级会谈到pboard守护使用XPC,因此要获得所有pasteboards的列表,pboard需要用纸板名列表响应处理一些XPC消息。

pboard 程序很简单:初始化各种东西(日志、沙箱、调度队列、mach 服务)然后调用 __CFPasteboardStartServicingConnection,其实是在 CoreFoundation 框架中定义的。该函数最终通过调用来处理每个传入的 XPC 请求_CFHandlePasteboardXPCEvent

看着_CFHandlePasteboardXPCEvent在反汇编(我用料斗),我们可以看到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
Run Code Online (Sandbox Code Playgroud)

这些都没有像com.apple.pboard.get-pboard-names. 看看它们的处理方式,几乎所有人所做的第一件事就是从事件中获取粘贴板名称,然后查找或创建具有该名称的粘贴板。

我发现的唯一一个不立即涉及按名称查找粘贴板的请求是com.apple.pboard.resolve-all-promises,它实际上发送了有趣的消息+[_CFPasteboardStore copyAllPasteboards]。但是,据我所知,它不会将结果或实际上任何结果发送回客户端。这是copyAllPasteboardsCoreFoundation 中选择器的唯一用途。

因此,除非您使用调试器附加到 pboard 守护程序并四处查看,否则您将找不到所有现有粘贴板的列表。(使用调试器连接到 pboard 需要首先禁用 SIP,这需要启动您的恢复分区。)

  • 这真是一个令人印象深刻的答案!我没想到会有如此完整和信息丰富的东西。我将不得不尝试你提到的一些事情。我从未禁用过 SIP 或使用调试器附加到守护进程,但这听起来像是一次有趣的冒险。非常感谢您抽出宝贵时间认真回答! (2认同)
  • 根据您给我的建议,我能够获得现有粘贴板的列表。以防万一您好奇,这里是:AppleKeyboardInputMethodsPasteboard、AppleInputSourcesInUIOrderPasteboard、com.apple.macos.hitoolbox.macmanager、DefaultAsciiKeyboardLayoutPasteboard、AppleKeyboardLayoutOverridePasteboard、ApplePerContextInputPasteboard、AppleSavedCurrentInputSourcePasteboard、Apple CFPasteboard find、AppleInternationalPasteboard-le、AppleIntlFileCacheModificationDatePasteboard (2认同)