【问题标题】:List all NSPasteBoard names on macOS列出 macOS 上的所有 NSPasteBoard 名称
【发布时间】:2019-10-03 01:46:42
【问题描述】:

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

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

【问题讨论】:

    标签: macos cocoa nspasteboard


    【解决方案1】:

    不,没有功能可以做到这一点,即使使用私有 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,这需要启动您的恢复分区。)

    【讨论】:

    • 这真是一个令人印象深刻的答案!我没想到会有这么完整和翔实的东西。我将不得不尝试你提到的一些事情。我从未禁用 SIP 或使用调试器附加到守护程序,但这听起来像是一次有趣的冒险。非常感谢您抽出宝贵时间认真回答!
    • 我能够使用您给我的建议获得现有粘贴板的列表。以防您好奇,它们是:AppleKeyboardInputMethodsPasteboard、AppleInputSourcesInUIOrderPasteboard、com.apple.macos.hitoolbox.macmanager、DefaultAsciiKeyboardLayoutPasteboard、AppleKeyboardLayoutOverridePasteboard、ApplePerContextInputPasteboard、AppleSavedCurrentInputSourcePasteboard、Apple CFPasteboard find、AppleInternationalPasteboard-le、AppleIntlFileCacheModificationDatePasteboard
    猜你喜欢
    • 2022-10-12
    • 2023-03-20
    • 2016-04-17
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多