2015-02-28 3 views
1

[1] Когда я выбираю и нажимаю правой кнопкой мыши любой текст в любом приложении, я получаю меню Services, где я могу щелкнуть, чтобы вызвать любую услугу, такую ​​как Search With Google.Как щелкнуть правой кнопкой мыши текст и выбрать сервис?

После нажатия на объект, содержащий выделенный текст, автоматически отправляется объект NSPasteboard.

[2] Сторонние приложения могут использовать функцию BOOL NSPerformService (NSString *itemName, NSPasteboard *pboard) для программного вызова любой службы.

Здесь приложение должно установить NSPasteboard объект, который отправляется службе.


Есть ли способ программно ссылаться на какую-либо услугу, но без установки NSPasteboard объекта (NSPasteboard объект должен автоматически содержать выделенный текст, как и в [1])?

Как объект NSPasteboard, содержащий выделенный текст, отправленный службе OS X в [1]? Есть ли частный API?

ответ

3

Это задокументировано в Services Implementation Guide, в частности в главе Using Services.

Во-первых, когда пользователь открывает меню «Службы», Cocoa вызывает -validRequestorForSendType:returnType: на объектах в цепочке ответчиков, чтобы определить, какие комбинации типа отправки и типа возврата могут быть обработаны каким-либо объектом, если таковые имеются, в зависимости от его текущего состояния (например, текущий выбор). Это контролирует, какие пункты меню Услуги включены.

Когда пользователь выбирает пункт меню службы, Cocoa создает картотеку и вызывает -writeSelectionToPasteboard:types: объект-запрос, возвращенный -validRequestorForSendType:returnType:. Этот объект должен помещать данные выбора на прилагаемом картотеке в зависимости от типа, который он поддерживает.

Какао затем передает картону в систему. Система взаимодействует с Cocoa в процессе поставщика услуг. Cocoa вызывает -<messageName>:userData:error: на объекте поставщика услуг в этом процессе, где <messageName> происходит из описания службы в файле Info.plist этого приложения. Объектом поставщика услуг является приложение, зарегистрированное в Cocoa, с использованием NSRegisterServicesProvider().

Поставщик услуг обрабатывает входные данные, если они есть, из картона и сохраняет возвращаемые данные, если они есть.

После того, как поставщик завершен, Cocoa в исходном приложении вызывает -readSelectionFromPasteboard: на объекте запроса. Опять же, к этому методу предоставляется картон.

+0

Спасибо. Это все хорошо, но вместо какао, может ли это сделать приложение? Мое приложение принадлежит службе и должно ее программно использовать. Я не могу имитировать горячую клавишу моего приложения, потому что он может быть удален/изменен пользователем. – Kaatt

+0

Нет, вы не можете программно инициировать вызов службы от имени другого приложения, по крайней мере, не надежно. В каких обстоятельствах вы хотите? То есть, если он не инициируется пользователем, какие критерии вы бы использовали для его запуска? –

+0

Он инициирован пользователем, но не использует горячие клавиши или такие. Как пользовательское оборудование/SMS. – Kaatt

Смежные вопросы