繁体   English   中英

列出macOS上的所有NSPasteBoard名称

[英]List all NSPasteBoard names on macOS

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

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

不,即使使用私有API,也没有这方面的功能。

pboard程序( /usr/libexec/pboard )作为守护程序运行并管理所有共享的粘贴板。 NSPasteboard类使用XPC与pboard守护进程通信,因此要获得所有粘贴板的列表,pboard需要通过响应粘贴板名称列表来处理一些XPC消息。

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

在反汇编_CFHandlePasteboardXPCEvent中查看_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.get-pboard-names 看看他们是如何处理的,几乎所有人都做的第一件事是从事件中获取粘贴板名称并查找或创建具有该名称的粘贴板。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM