如何右键单击文本并选择服务?

时间:2015-02-28 20:54:55

标签: objective-c cocoa swift nspasteboard

[1]当我选择并右键点击任何应用中的任何文字时,我会看到一个Services菜单,我可以点击此处调用Search With Google等任何服务。

单击后,NSPasteboard对象将自动发送到包含所选文本的服务。

[2]第三方应用可以使用BOOL NSPerformService ( NSString *itemName, NSPasteboard *pboard )函数以编程方式调用任何服务。

此处应用必须设置NSPasteboard对象,该对象将发送到服务。


有没有办法以编程方式调用任何服务,但是没有设置NSPasteboard对象(NSPasteboard对象应该自动包含所选文本,如[1]中所示)?

在[1]中OS X如何将包含所选文本的NSPasteboard对象发送给服务?是否有一些私有API?

1 个答案:

答案 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:。同样,粘贴板也提供给该方法。