Cocoa 脚本:如何使用 AppleScript 处理程序(事件)?
Cocoa Scripting: How do I use AppleScript handlers (events)?
为我的 Mac 应用程序添加脚本能力,我想知道我是否可以从我的应用程序调用脚本端的处理程序。如果是这样,它是如何工作的?
据我了解,处理程序类似于函数(如 "on run" 中所示),可以由来自脚本自身代码之外的事件调用。 Sdef 文件理解 event
标签,因为我可以使用 Sdef Editor 输入事件。但是我在 Cocoa 脚本指南中找不到任何关于此的文档。
我的应用程序记录了剪贴板,所以我想知道我是否可以让 运行ning 脚本知道一个新的剪贴板已被记录,以便脚本可以对其进行操作。
现在,如果用户可以拥有一个脚本 运行,我宁愿喜欢它,而不是为这样的事件调用我定位和加载的单独(独立)脚本和 运行不断声明我的应用程序随后调用的事件。 (这是否真的是个好主意不应该在这里讨论,我只是以此为例来理解 AppleScript 事件。)
这可能吗?如果不是,sdef 中的事件条目是什么意思?
更新:这里是 AppleScript 处理程序的介绍:MacScripter: Getting Started with Handlers
实施 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
,表示客户端或目标应用程序为 return 地址。
事件处理程序的工作方式类似于命令,这里是一个非常基本的示例
<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
为我的 Mac 应用程序添加脚本能力,我想知道我是否可以从我的应用程序调用脚本端的处理程序。如果是这样,它是如何工作的?
据我了解,处理程序类似于函数(如 "on run" 中所示),可以由来自脚本自身代码之外的事件调用。 Sdef 文件理解 event
标签,因为我可以使用 Sdef Editor 输入事件。但是我在 Cocoa 脚本指南中找不到任何关于此的文档。
我的应用程序记录了剪贴板,所以我想知道我是否可以让 运行ning 脚本知道一个新的剪贴板已被记录,以便脚本可以对其进行操作。
现在,如果用户可以拥有一个脚本 运行,我宁愿喜欢它,而不是为这样的事件调用我定位和加载的单独(独立)脚本和 运行不断声明我的应用程序随后调用的事件。 (这是否真的是个好主意不应该在这里讨论,我只是以此为例来理解 AppleScript 事件。)
这可能吗?如果不是,sdef 中的事件条目是什么意思?
更新:这里是 AppleScript 处理程序的介绍:MacScripter: Getting Started with Handlers
实施 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
,表示客户端或目标应用程序为 return 地址。
事件处理程序的工作方式类似于命令,这里是一个非常基本的示例
<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