Cocoa脚本:如何使用AppleScript处理程序(事件)?

时间:2016-04-21 09:32:54

标签: applescript cocoa-scripting

为我的Mac应用程序添加脚本功能,我想知道我是否可以从我的应用程序调用脚本端的处理程序。如果是这样,那怎么办?

据我所知,处理程序就像函数一样(在“运行中”),可以通过来自脚本自身代码之外的事件来调用。并且Sdef文件了解event标记,看到我可以使用Sdef Editor输入事件。但是我在Cocoa脚本编写指南中找不到任何关于此的文档。

我的应用程序记录了剪贴板,所以我想知道是否可以让运行脚本知道已经记录了一个新的剪贴板,以便脚本可以对其进行操作。

现在,我不想调用我为这样的事件定位并加载和运行的单独(独立)脚本,我宁愿喜欢它,如果用户可以不断运行脚本来声明我的应用随后调用的事件。 (这不应该在这里讨论,我只是以此为例来理解AppleScript事件。)

这可能吗?如果没有,sdef中的事件条目是什么意思?

更新:以下是AppleScript中处理程序的简介:MacScripter: Getting Started with Handlers

1 个答案:

答案 0 :(得分:1)

实现AppleScript事件处理程序的难点在于应用程序必须具有对脚本的永久引用。

例如,在Finder,Messages,Mail中处理事件处理程序的脚本必须在 目标应用程序中注册,以保持对脚本的引用。

当脚本实现其中一个提供的事件处理程序时,目标应用程序会使用

创建NSAppleEventDescriptor
initWithEventClass:kHandlerEventClass 
           eventID:kEventID
  targetDescriptor:kEventTargetDescriptor 
          returnID:kAutoGenerateReturnID // predefined constant in CarbonCore.h
     transactionID:kAnyTransactionID]; // predefined constant in CarbonCore.h

包括参数的子描述符,并通过executeAppleEvent在目标脚本引用上发送。

  • kEventID是sdef文件中8个字符代码中最不重要的4位('EfgH')。
  • kHandlerEventClass是sdef文件中8个字符代码中最重要的4位('abcD')。
  • kEventTargetDescriptorNSAppleEventDescriptor,表示客户端或目标应用程序为返回地址。

事件处理程序与命令类似,这是一个非常基本的例子

<event name="did appear something" code="abcDEfgH" description="This handler is called when something appears.">
     <direct-parameter description="The names of the appeared something.">
        <type type="text" list="yes"/>
     </direct-parameter>
     <parameter name="with result" code="smTS" description="A record of some information about the names" type="something reply"/>
</event>
在AppleScript中

实现了处理程序

on did appear something theNames with result theResult
  • theNames是一个文本列表
  • theResult是自定义记录类型something reply