Перечислите все имена NSPasteBoard на macOS - PullRequest
0 голосов
/ 05 декабря 2018

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

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

1 Ответ

0 голосов
/ 06 декабря 2018

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

...