Apple events - AppleScript

tabliertablier Membre
03:42 modifié dans API AppKit #1
Je souhaite interroger une autre application pour obtenir des informations.
Le dictionnaire Applescript de cette application est accessible.
??? Je lis la doc sur AppleScript et les Apple events, mais pour l'instant, cela m'apparait  comme certains objects Cocoa, c'est à  dire OPAQUE!!

Dans un projet "Cocoa Application", puis-je interroger l'application externe directement par des Apple events ou dois-je ajouter des handlers Applescript dans mon application pour faire l'intérogation (handlers que j'appelerai par des Apple events probablement)?
Si l'intérrogation directe est possible, que faut-il connaà®tre de l'application externe, en plus de son dictionnaire?

Réponses

  • elfelf Membre
    03:42 modifié #2
    Apple Events: je crois que les apples events ce sont une manière de communiquer entre les applications Carbon (c'est aussi possible avec Cocoa, mais en cocoa on utilise plutôt les notifications distribuée)

    je crois que les apple events et les applescript n'ont rien à  voire ensemble

  • ClicCoolClicCool Membre
    03:42 modifié #3
    dans 1163161722:

    je crois que les apple events et les applescript n'ont rien à  voire ensemble


    Ah bon ???

    Visiblement tu n'as jamais pris la peine de rendre tes applications scriptables ...


    Cocoa scripting refers to the support provided by the Cocoa application framework for creating scriptable applications. It includes classes, categories, and scriptability information that specifies the supported AppleScript terminology and the class information needed to work with it. .../...

    .../...A scriptable application specifies the set of scripting terms it understands and provides information that AppleScript uses to compile scripts that use those terms. When a user executes a script that targets the application, Apple events are sent to the application. Apple events can also be sent by other applications and by the Mac OS.


    Le détail et là : http://developer.apple.com/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/index.html
  • AliGatorAliGator Membre, Modérateur
    03:42 modifié #4
    Heu si ça a carrément à  voir ensemble AppleScript et AppleEvent.

    les AppleEvent ce sont des évènements envoyés à  une application.
    AppleScript est un langage de script permettant d'envoyer des AppleEvents facilement, en gros. Quand tu écris "tell application "Finder" to open selection" ça va envoyer un AppleEvent à  l'application Finder avec le code de l'AppleEvent correspondant à  la commande "open", et avec comme paramètre le fichier sélectionné...

    C'est c'est au contraire étroitement lié.
  • ClicCoolClicCool Membre
    03:42 modifié #5
    GRILLED Ali  ;D
  • AliGatorAliGator Membre, Modérateur
    03:42 modifié #6
    dans 1163178926:

    GRILLED Ali  ;D
    Fallait bien que j'honore encore une fois mon statut de "Grillé à  retardement" (le temps de taper mes posts de 3km, tu sais bien)  :) ;D
  • tabliertablier Membre
    03:42 modifié #7
    Le fait qu'Applescript envoie des "apple events" aux applications scriptables n'est pas une grosse surprise (c'est écrit dans la doc!).

    Ce que je cherche a faire c'est me passer d'applescript. Mon controleur d'archivage "Incrémental" est un projet "AppleScript studio". J'interroge CDFinder en Applescript, mais c'est lent!
    >:( Je lis donc la doc sur les Apple events et je n'arrive pas à  concrétiser! J'ai l'impression qu'il me manque des informations pour écrire ces appels. La seule information que j'ai est le dictionnaire de CDFinder et je ne vois pas comment m'en servir lors de l'écriture des AE.
    Mon copain Paul me dit que sous debugger AppleScript (lequel?), on peut voir les AE générés. Je ne suis pas arrivé à  cela non plus!!

    :-\\  Qui peut m'expliquer cela brièvement ou me mettre sur la bonne voie ou encore me trouver de bons exemples?
  • ClicCoolClicCool Membre
    novembre 2006 modifié #8
    Salut Tablier,

    Je ne suis pas sur de saisir ton pb hors mis qu'un projet d'AppleScript studio est lent ce que je te concède volontiers.

    Je ne vois pas comment générer des Apple Events isolés te permettrait de communiquer (échanger des infos) avec une autre appli. Mais c'est vrai que j'ai jamais ressenti le besoin de voir ça de près.

    Par contre tu peux toujours appeler, compiler, exécuter... des Applescript dans une appli cocoa.

    Tu peux surtout tout simplement limiter tes appels à  des Apple Script compilés en les lançant isolément avec NSTask.
  • BruBru Membre
    03:42 modifié #9
    dans 1163197008:

    Qui peut m'expliquer cela brièvement ou me mettre sur la bonne voie ou encore me trouver de bons exemples?


    Cocoa ne permet pas de créer/envoyer des apple-events (uniquement recevoir).
    Il te faut donc passer par Carbon.

    .
  • tabliertablier Membre
    03:42 modifié #10
    Pour les NStask je vais aller voir la doc.
    Cocoa ne permet pas de créer/envoyer des apple-events (uniquement recevoir).
    Il te faut donc passer par Carbon.

    ça, c'est moins facile comme programmation! je pense que je vais essayer quand même.

    Pour les AppleEvents, je continue de lire et je suis tombé sur la phrase:
    Similarly, if you want to send Apple events to other applications, you are dependent on those applications to provide the event class, event ID, and any other information you need to construct an Apple event the application can understand.


    je résume:
    Ou bien je peux obtenir les informations necessaires du concepteur de CDFinder (ce qui n'est pas impossible puisque nous correspondons régulièrement), ou bien je me contente de l'appleScript.
    Si je me contente de l'appleScript, j'ai le choix entre rester en AppleScript Studio, ou passer en Objective-C avec des appels à  CDFinder en AppleScript compilé.
    En objective-C, appeler des handlers AScript ce fait (sic la doc) en utilisant des Apple events, Je suis revenu au point de départ !!!
    ??? Ai-je bien résumé mes choix?
  • BruBru Membre
    03:42 modifié #11
    dans 1163412547:

    Ai-je bien résumé mes choix?


    Je ne sais pas.

    Mais une chose que je sais est qu'il est extrêmement facile d'intégrer du AS dans un programme Objective-C/cocoa.

    Je te joins un exemple qui permet d'ouvrir le dossier /Developer du mac dans le Finder, et qui demande le nom du premier élément de ce répertoire. Le nom est récupéré dans le prog ObjC bien sûr.
    <br />- (void)uneMethode<br />{<br />&nbsp; &nbsp; NSAppleScript *as;<br />&nbsp; &nbsp; NSAppleEventDescriptor *aed;<br />&nbsp; &nbsp; NSString *script;<br />&nbsp; &nbsp; NSDictionary *err;<br /><br />&nbsp; &nbsp; // création du script<br />&nbsp; &nbsp; script=@&quot;tell application &#092;&quot;Finder&#092;&quot; &#092;n &#092;<br />&nbsp; &nbsp; open folder &#092;&quot;imac-g5:Developer&#092;&quot; &#092;n &#092;<br />&nbsp; &nbsp; get the name of the first item in folder &#092;&quot;imac-g5:Developer&#092;&quot; &#092;n &#092;<br />&nbsp; &nbsp; end tell&quot;;<br /><br />&nbsp; &nbsp; // création du script et exécution<br />&nbsp; &nbsp; as=[[NSAppleScript alloc] initWithSource:script];<br />&nbsp; &nbsp; aed=[as executeAndReturnError:&amp;err];<br /><br />&nbsp; &nbsp; // récupération du résultat (si pas d&#39;erreur)<br />&nbsp; &nbsp; if (err==nil) NSLog(@&quot;résultat=%@&quot;, [aed stringValue]);<br />&nbsp; &nbsp; else NSLog(@&quot;erreur=%@&quot;, err);<br />}<br />
    


    PS : je t'affiche le script AS plus clairement, car je l'ai condensé un peu dans la variable script :
    [tt]tell application "Finder"
      open folder "imac-g5:Developer"
      get the name of the first item in folder "imac-g5:Developer"
    end tell
    [/tt]
    .
  • tabliertablier Membre
    03:42 modifié #12
    Merci pour cet exemple.
    Je connais déjà  cette méthode qui consiste à  créer, compiler et exécuter Dynamiquement un script. J'ai mis quelque chose comme cela dans le tutorial Cacao au chapitre "implémentation, suite".
    Juste une chose, je n'ai pas dû comprendre la doc sur l'utilisation du pool mémoire, pourquoi ne mets-tu pas de [as release] avant de ressortir de la méthode?

    Comme je cherche de la vitesse et que les paramètres à  passer changent à  chaque appel, les trois opérations sont à  refaire à  chaque fois. Je ne suis pas sur de gagner quelque chose par rapport au projet AppleScript Studio.
    Bon, j'ai écrit à  Norbert Doerner pour voir s'il me passe les informations qui me manquent pour écrire des appels directs à  son programme.

    Et enfin, je viens d'essayer AppleScrip debugger de "Late Night Sofware". Il me semble que c'est nettement plus performant que le debugger AppleScript d'Xcode. Juste un peu cher pour quelqu'un qui est un diletante à  la retraite.
  • BruBru Membre
    03:42 modifié #13
    dans 1163449792:

    Juste une chose, je n'ai pas dû comprendre la doc sur l'utilisation du pool mémoire, pourquoi ne mets-tu pas de [as release] avant de ressortir de la méthode?


    Parce que j'ai oublié !

    .
  • elfelf Membre
    03:42 modifié #14
    dans 1163178370:

    dans 1163161722:

    je crois que les apple events et les applescript n'ont rien à  voire ensemble


    Ah bon ???

    Visiblement tu n'as jamais pris la peine de rendre tes applications scriptables ...


    Cocoa scripting refers to the support provided by the Cocoa application framework for creating scriptable applications. It includes classes, categories, and scriptability information that specifies the supported AppleScript terminology and the class information needed to work with it. .../...

    .../...A scriptable application specifies the set of scripting terms it understands and provides information that AppleScript uses to compile scripts that use those terms. When a user executes a script that targets the application, Apple events are sent to the application. Apple events can also be sent by other applications and by the Mac OS.


    Le détail et là : http://developer.apple.com/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/index.html


    Autant pour moi!

    La dernière fois que j'ai utilisé les AppleEvent c'était il y 5 ans quand j'était encore sous MacOS9 ;)
  • tabliertablier Membre
    03:42 modifié #15
    ??? Je suis un peu étonné! personne n'utilise les Apple Events pour intérroger une application tierce?

    J'aimerais savoir: si vous voulliez connaà®tre le nombre des listes de lecture enregistrées dans iTunes (par exemple),
    quelle technologie utiliseriez-vous?
  • ClicCoolClicCool Membre
    03:42 modifié #16
    hoksitan a déjà  fait ça (interrogation de la lecture en cours d'iTune, des BAL de mail etc ...)
    Et, autant que je m'en souvienne, le lancement de miniscript compilés (placés dans le bundle de son projet) donnait des résultats très convenables, malgrés le besoin qu'il avait en CPU (son appli en était gourmande pour gérer des animations fluides simultanées à  ses requètes scriptées).


    Et pourtant, à  l'époque, son code était perfectible  :P
  • AliGatorAliGator Membre, Modérateur
    03:42 modifié #17
    dans 1163531430:
    J'aimerais savoir: si vous voulliez connaà®tre le nombre des listes de lecture enregistrées dans iTunes (par exemple), quelle technologie utiliseriez-vous?
    Ben AppleScript. Avec des bouts de code comme celui qu'a donné Bru.
Connectez-vous ou Inscrivez-vous pour répondre.