2016-04-21 81 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

相關問題