1

向我的 Mac 应用程序添加脚本功能,我想知道是否可以从我的应用程序调用脚本末端的处理程序。如果是这样,它是如何工作的?

据我了解,处理程序就像函数(如“运行时”),可以由来自脚本自身代码之外的事件调用。Sdef 文件理解event标签,看到我可以使用Sdef Editor输入事件。但是我在 Cocoa Scripting Guide 中找不到任何关于此的文档。

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

现在,与其调用我为此类事件定位并加载和运行的单独(独立)脚本,我更希望用户可以持续运行一个脚本来声明我的应用程序随后调用的事件。(这里不应该讨论这是否真的是一个好主意,我只是以此作为理解 AppleScript 事件的示例。)

那可能吗?如果不是,sdef 中的事件条目是什么意思?

更新:这是 AppleScript 中处理程序的介绍:MacScripter:处理程序入门

4

1 回答 1

1

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

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

当脚本实现提供的事件处理程序之一时,目标应用程序会创建一个NSAppleEventDescriptorwith

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

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

  • kEventID是 sdef 文件 ('EfgH') 中 8 个字符代码的最低 4 个有效位。
  • kHandlerEventClass是 sdef 文件 ('abcD') 中 8 个字符代码的最高 4 个有效位。
  • kEventTargetDescriptor是一个NSAppleEventDescriptor将客户端或目标应用程序表示为返回地址。

事件处理程序的工作方式类似于命令,这里是一个非常基本的示例

<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
于 2016-04-21T14:32:37.880 回答