Перечислите все имена NSPasteBoard на macOS

Есть ли способ получить список всех плат NSPasteBoard и их имен в текущей системе?

Мне интересно, есть ли какая-либо функция (даже если частный API) для достижения этой цели. Спасибо!

1 ответ

Решение

Нет, для этого нет функции, даже с частным API.

Программа pboard (/usr/libexec/pboard) работает как демон и управляет всеми общими монтажными панелями. NSPasteboard класс общается с демоном pboard с помощью XPC, поэтому для получения списка всех монтажных панелей pboard должен обработать некоторое сообщение XPC, ответив списком имен монтажных панелей.

Программа pboard очень проста: она инициализирует различные вещи (логи, песочница, очередь отправки, служба mach) и затем вызывает __CFPasteboardStartServicingConnection, который на самом деле определяется в рамках CoreFoundation. Эта функция в конечном итоге обрабатывает каждый входящий запрос 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.resolve-all-promises, который на самом деле отправляет интригующее сообщение +[_CFPasteboardStore copyAllPasteboards], Однако, насколько я могу судить, он не отправляет результат или фактически какой-либо результат обратно клиенту. И это единственное использование copyAllPasteboards селектор в CoreFoundation.

Таким образом, если вы не подключитесь к демону pboard с помощью отладчика и не покопаетесь, вы не найдете список всех существующих монтажных панелей. (Для подключения к pboard с помощью отладчика необходимо сначала отключить SIP, что требует загрузки раздела восстановления.)

Другие вопросы по тегам