Skip to main content
 首页 » 操作系统

objective-c之右键单击文本并选择服务如何工作

2024年01月01日38luoye11

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

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

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

此处应用程序必须设置发送到服务的 NSPasteboard 对象。


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

包含选定文本的 NSPasteboard 对象如何被 OS X 在 [1] 中发送到服务?是否有一些私有(private) API?

请您参考如下方法:

这记录在 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:在请求者对象上。同样,将粘贴板提供给该方法。