2016-04-21 67 views
0

为我的Mac应用程序添加脚本功能,我想知道是否可以从我的应用程序调用脚本末端的处理程序。如果是这样,那是如何工作的?Cocoa脚本:我如何使用AppleScript处理程序(事件)?

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

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

现在,我不希望调用单独的(独立)脚本来查找并加载并运行这样的事件,而是希望用户能够不断运行一个脚本来声明一个事件,即我的应用程序调用。 (这是否是一个好主意不应该在这里讨论,我只是以此为例来理解AppleScript事件。)

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

更新:这是在AppleScript的处理程序上的介绍:MacScripter: Getting Started with Handlers

回答

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文件('EfgH')中8个char代码的至少4个有效位。
  • kHandlerEventClass是sdef文件('abcD')中8个char代码的最高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
+0

我已经能够通过使用硬编码的处理程序名称来调用我通过NSAppleScript加载的脚本的处理程序。我想这是它的更干净的版本。我看了一个使用这些事件的消息脚本,我想我现在可以将它们结合在一起。我猜这些知识大部分来自Cocoa脚本API和Inside Mac,现在很难找到,Apple已经从服务器中删除了所有旧文档。就好像它们不再有用:) –

+0

那么,你如何建议我管理脚本和我的应用程序之间的连接?我想我的应用程序必须选择(固定名称?)并加载脚本本身,然后使用其默认处理程序(“运行中”)运行它以启动并准备好它?应用程序是否也应该监视mod日期戳以在其更改时重新加载它?或者那是不好的,因为脚本可能会将它的属性存储在那里,当以这种方式重新加载时会导致问题?或者是否有脚本被用户调用并且应用程序识别脚本并保持连接的方式? –

+0

通过'NSAppleScript'运行脚本并将Apple Events发送给sdef文件中定义的处理程序是两件完全不同的事情。这取决于目标应用程序是否需要直接(单向)通知脚本特定事件的发生或使用类似库的脚本(双向)。还有第三种方式使用'NSAppleScriptTask'和位于指定'Application Scripts'文件夹中的脚本。 – vadian