[1]当我选择并右键点击任何应用中的任何文字时,我会看到一个Services
菜单,我可以点击此处调用Search With Google
等任何服务。
单击后,NSPasteboard
对象将自动发送到包含所选文本的服务。
[2]第三方应用可以使用BOOL NSPerformService ( NSString *itemName, NSPasteboard *pboard )
函数以编程方式调用任何服务。
此处应用必须设置NSPasteboard
对象,该对象将发送到服务。
有没有办法以编程方式调用任何服务,但是没有设置NSPasteboard
对象(NSPasteboard
对象应该自动包含所选文本,如[1]中所示)?
在[1]中OS X如何将包含所选文本的NSPasteboard
对象发送给服务?是否有一些私有API?
答案 0 :(得分:3)
Services Implementation Guide中记录了这一点,特别是Using Services章节。
首先,当用户打开“服务”菜单时,Cocoa会对响应程序链中的对象调用-validRequestorForSendType:returnType:
,以确定哪个对象(如果有)基于其对象可以处理哪种发送类型和返回类型的组合当前状态(例如当前选择)。它控制启用哪些服务菜单项。
当用户选择服务菜单项时,Cocoa会创建一个粘贴板并在-writeSelectionToPasteboard:types:
返回的请求者对象上调用-validRequestorForSendType:returnType:
。该对象应该将选择数据放在所提供的粘贴板上,无论它支持哪种类型。
然后Cocoa将粘贴板传递给系统。系统在服务提供者进程中与Cocoa通信。 Cocoa在该进程中调用服务提供者对象上的-<messageName>:userData:error:
,其中<messageName>
来自该应用程序的Info.plist文件中的服务描述。服务提供者对象是使用NSRegisterServicesProvider()
向Cocoa注册的应用程序。
服务提供商处理来自粘贴板的输入数据(如果有),并将返回数据(如果有)存储到其中。
提供程序完成后,原始应用程序中的Cocoa会在请求者对象上调用-readSelectionFromPasteboard:
。同样,粘贴板也提供给该方法。