Перечислите все имена 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, что требует загрузки раздела восстановления.)