【问题标题】:How does right-clicking text and selecting a service work?右键单击文本并选择服务如何工作?
【发布时间】:2015-02-28 20:54:54
【问题描述】:

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

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

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

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


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

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

【问题讨论】:

    标签: objective-c cocoa swift nspasteboard


    【解决方案1】:

    这在Services Implementation Guide,特别是Using Services 章节中有记录。

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

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

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

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

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

    【讨论】:

    • 谢谢。这一切都很好,但不是 Cocoa,我的应用程序可以做到吗?我的应用拥有该服务,应该以编程方式调用它。我无法模拟我的应用服务的热键,因为它可以由用户删除/更改。
    • 不,您不能以编程方式代表另一个应用程序启动服务调用,至少不可靠。在什么情况下你会想要?也就是说,如果它不是由用户发起的,你会使用什么标准来发起它?
    • 它是由用户发起的,而不是使用热键之类的。比如定制硬件/短信。
    • 您可以向 Apple 发起开发者技术支持事件,看看他们是否有建议。这听起来有点像可访问性问题。您是否尝试过使用 Accessibility API 从“服务”菜单调用项目而不是复制选择?
    • 不,但谢谢这是一个很好的建议。尽管如果用户禁用该服务,它将无法正常工作。 NSPerformService 无需启用该服务即可工作。
    猜你喜欢
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多