1

[1] 当我选择并右键单击任何应用程序中的任何文本时,我会看到一个Services菜单,我可以在其中单击以调用任何服务,例如Search With Google.

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

[2] 3rd 方应用程序可以使用该BOOL NSPerformService ( NSString *itemName, NSPasteboard *pboard )功能以编程方式调用任何服务。

在这里,应用程序必须设置NSPasteboard发送到服务的对象。


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

[1] 中的 OS X如何将NSPasteboard包含选定文本的对象发送到服务?有一些私有API吗?

4

1 回答 1

3

这记录在服务实施指南中,特别是使用服务一章。

首先,当用户打开服务菜单时,Cocoa 调用-validRequestorForSendType:returnType:响应者链中的对象来确定哪些发送类型和返回类型的组合可以由哪个对象处理,如果有的话,基于其当前状态(例如当前选择) . 这控制启用哪些服务菜单项。

当用户选择服务菜单项时,Cocoa 会创建一个粘贴板并调用-writeSelectionToPasteboard:types:-validRequestorForSendType:returnType:. 该对象应将选择数据放在它支持的任何类型的粘贴板上。

然后可可将粘贴板传递给系统。系统在服务提供者进程中与 Cocoa 进行通信。Cocoa-<messageName>:userData:error:在该进程中调用服务提供者对象,其中<messageName>来自该应用程序的 Info.plist 文件中的服务描述。服务提供者对象是任何使用NSRegisterServicesProvider().

服务提供者处理来自粘贴板的输入数据(如果有)并将返回数据(如果有)存储到它。

提供者完成后,原始应用程序中的 Cocoa 调用-readSelectionFromPasteboard:请求者对象。同样,粘贴板提供给该方法。

于 2015-02-28T21:41:15.887 回答