为我的Mac应用程序添加脚本功能,我想知道我是否可以从我的应用程序调用脚本端的处理程序。如果是这样,那怎么办?
据我所知,处理程序就像函数一样(在“运行中”),可以通过来自脚本自身代码之外的事件来调用。并且Sdef文件了解event
标记,看到我可以使用Sdef Editor输入事件。但是我在Cocoa脚本编写指南中找不到任何关于此的文档。
我的应用程序记录了剪贴板,所以我想知道是否可以让运行脚本知道已经记录了一个新的剪贴板,以便脚本可以对其进行操作。
现在,我不想调用我为这样的事件定位并加载和运行的单独(独立)脚本,我宁愿喜欢它,如果用户可以不断运行脚本来声明我的应用随后调用的事件。 (这不应该在这里讨论,我只是以此为例来理解AppleScript事件。)
这可能吗?如果没有,sdef中的事件条目是什么意思?
更新:以下是AppleScript中处理程序的简介:MacScripter: Getting Started with Handlers
答案 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')。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