# [AppleScript] modifier les touches du clavier ?!



## NoAPM (5 Mars 2011)

Bonjour !

je suis néophyte, je tente de faire petit programme tres simple sur appleScript :
lorsque j'appuie sur une touche dans Writeroom ou textEdit je voudrais que cela écrive autre chose.

Ex : si je tappe "b" ou "B" il s'écrive "Bleu"

Je n'arrive pas a dire en AppleScript "quand l'utilisateur appui sur b"
J'ai un problème de script, je voudrais qu'il dure a l'infini (ou tant que je ne lui ai pas dit stop).

voila mon script ...


> tell application "WriteRoom"
> activate
> end tell
> tell application "System Events" to keystroke "n" using command down
> ...


Merci de votre aide !

---------- Nouveau message ajouté à 19h02 ---------- Le message précédent a été envoyé à 17h19 ----------

j'ai trouvé bcp plus interessant pour mon usage : http://startly.com/products/quickeys/mac/4/
C'est exactement ce que je voulais !

bon maintenant quelqu'un sait comment mettre un variable a la place du N° 25 :
tell application "System Events" to keystroke "BlueSky N°25"

je suis aussi entrain de chercher comment repeter une action pendant x minutes ... 
Quelqu'un a une idée ?

cela serait fantastique !


----------



## Anonyme (5 Mars 2011)

Bonjour,



NoAPM a dit:


> bon maintenant quelqu'un sait comment mettre un variable a la place du N° 25 :



Comme ceci

```
tell application "System Events" to keystroke ("BlueSky " & laVariable)
```



NoAPM a dit:


> je suis aussi entrain de chercher comment repeter une action pendant x minutes ...
> cela serait fantastique !



Voici un exemple

```
set d to current date
repeat
	-- code pour ton actiom

	if (current date) - d > 120 then exit repeat -- le nombre 120 est le nombre de secondes --> 2 minutes
end repeat
```


----------



## NoAPM (6 Mars 2011)

Merci beaucoup, cela m'a bien aidé !!
voila le resultat :



> tell application "WriteRoom"
> activate
> end tell
> tell application "System Events" to keystroke "n" using command down
> ...



Vous pensez que cela marche sur un vieux mac ayant un OS 1.3 ???
Il vaux mieux que je fasse une version logiciel ou une version scpt ?
et savez vous si c'est possible de faire un bouton d'urgence pour arreter le repeat (car le programme est en full screen) ?
j'ai essayer cmd+tab pendant la boucle mais ce n'est pas une bonne solution du tout ...


----------



## Anonyme (6 Mars 2011)

NoAPM a dit:


> Vous pensez que cela marche sur un vieux mac ayant un OS 1.3 ???
> Il vaux mieux que je fasse une version logiciel ou une version scpt ?
> et savez vous si c'est possible de faire un bouton d'urgence pour arreter le repeat (car le programme est en full screen) ?
> j'ai essayer cmd+tab pendant la boucle mais ce n'est pas une bonne solution du tout ...


Cela devrait fonctionner sur *Mac OS X 10.3 +*

Script ou application, c'est ton choix si tu préfères le lancer par le menu script, raccourci-clavier ou l'ouvrir l'application par le Finder.

bouton d'urgence, non ce n'est pas possible, il faut mettre une autre condition dans la boucle pour l'arrêter.
Mais quelle condition ?


----------



## NoAPM (9 Mars 2011)

L'idée serait de faire "un bouton d'urgence type : cmd + p (par exemple)
je n'arrive pas à trouver le code pour dire "lorsque ce bouton est appuyé faire ..."


----------



## Larme (9 Mars 2011)

Mets un booléen


----------



## Anonyme (9 Mars 2011)

Bojour,



NoAPM a dit:


> L'idée serait de faire "un bouton d'urgence type : cmd + p (par exemple)
> je n'arrive pas à trouver le code pour dire "lorsque ce bouton est appuyé faire ..."


Ce n'est pas possible par touche, AppleScript n'a aucune commande pour récupérer les  touches pressées, sauf par ajout d'*osax* ou d'un *exécutable* en ligne de commande dans le système.

La  solution : 
C'est de sortir du plein écran quand tu voudras arrêter le script, (commande + Entrée).
Le script vérifie la propriété resizable de la première fenêtre de "*WriteRoom*", si elle est resizable, c'est que "WriteRoom" n'est plus en plein écran.

Mais, cela ne fonctionnera pas avec ton script, parce que  lorsque tu presseras les touches (commande + Entrée), ces touches seront a la fin  des touches simulées par le script.
Le probléme avec keystroke est que le script va plus vite que "WriteRoom" pour écrire le texte dans la fenêtre.
Exemple: pendant ces  10 secondes, le script simulera les touches pour environ 55 lignes, après le script quitte, mais "WriteRoom" prendra environ 1 minute  pour écrire ces lignes.

Aucun problème avec ce script, car il n'utilise pas la commande keystroke.

```
tell application "WriteRoom"
	activate
	make new document
end tell

set t_contents to ""
set d to current date

repeat
	set actionDuVent to {" _ plusieurs textes poétique en cours d'écriture _ "}
	set randomAction to some item of actionDuVent
	set t_contents to t_contents & (" " & (current date) & " Data " & randomAction) & return
	tell application "WriteRoom"
		set text contents of document 1 to t_contents
		set notFullScreen to resizable of window 1
	end tell
	
	if notFullScreen or (current date) - d > 10 then exit repeat
	delay 0.1
end repeat
```


----------



## NoAPM (10 Mars 2011)

Merci MacJac pour l'aide, c'est génial !
par contre, je n'arrive pas à comprendre le t_contents faut il mettre quelque chose dans les crochets de sa définition ?


----------



## Anonyme (10 Mars 2011)

Bonjour,



NoAPM a dit:


> par contre, je n'arrive pas à comprendre le t_contents faut il mettre quelque chose dans les crochets de sa définition ?


C'est une initialisation de la variable, car il est utilisé pour concaténer les lignes de texte, sinon une erreur de variable non définie s'affichera.

Cette  variable contient le même texte que le contenu de la fenêtre de  "WriteRoom"
Si vous voulez un mot ou une phrase dans la première ligne, oui vous pouvez ajoutez du texte.


----------



## NoAPM (6 Avril 2011)

je ne comprend pas pourquoi cela ne marche pas : il est impossible d'obtenir content avec textedit...
je suis repassé sur text edit et pour l'instant je ne touche pas trop à l'histoire du pleine ecran.


```
tell application "TextEdit"
    activate
    make new document
end tell

set t_contents to ""
set d to current date

repeat
    set actionDuVent to {"module la surface d'un océan, d'une mer ou d'un lac, il crée une agitation sous la forme d'une succession de vagues", "siffle sur les longues pales blanches en epoxy des éoliennes", "polie les roches", "gonfle les voiles des bateaux", "soulève tes cheveux", "renverse un pot de géranium", "atteint 1400 km/h sur Neptune", "s'engouffre dans les manches rouge et blanche", "s'appel Eole ", "est provoqué par un réchauffement inégalement réparti à la surface de la planète par lénergie solaire, et par la rotation de la planète."}
    set randomAction to some item of actionDuVent
    set t_contents to t_contents & (" " & (current date) & " A ce moment précis, Il " & randomAction) & return
    tell application "TextEdit"
        set text contents of document 1 to t_contents
    end tell
    
    if (current date) - d > 30 then exit repeat
    delay 0.1
end repeat
```


----------



## Anonyme (6 Avril 2011)

Bonjour,



NoAPM a dit:


> je ne comprend pas pourquoi cela ne marche pas : il est impossible d'obtenir content avec textedit...


Les commandes de chaque application ne sont pas toujours les mêmes.
Pour *TextEdit*  c'est :

```
tell application "TextEdit"
	set text of document 1 to t_contents
end tell
```


----------



## NoAPM (6 Avril 2011)

Merci beaucoup MacJack, tu es d'une aide precieuse !
Je ne comprend pas comment tu arrives (et les autres personnes aussi) à connaitre tout les petits détails d'une language de programmation ? je comprend bien que c'est une langue mais pour l'apprendre il faut avoir des cours ou au moins avoir des exemple (ou un dictionnaire grammatical) ... ou est donc le dictionnaire de AppleScript ? Comment peux t'on connaitre les limite d'un logiciel ?

...
Sinon comment adapter la fenêtre a la totalité de l'ecran sans faire du full screen ?


----------



## Anonyme (6 Avril 2011)

NoAPM a dit:


> Je ne comprend pas comment tu arrives (et les autres personnes aussi) à connaitre tout les petits détails d'une language de programmation ?


La documentation en français du langage général de l'AppleScript est ici --> http://trad.applescript.free.fr/applescript.html



NoAPM a dit:


> Comment peux t'on connaitre les limite d'un logiciel ?


Pour connaître les commandes, fonctions et propriétés de chaque application :
il faut ouvrir leurs dictionnaires AppleScript

Ouvre-le par le menu "*Fichier*" --> "*Ouvrir un dictionnaire...*". dans l'éditeur de script

Ou, glisse l'application et dépose-le sur l'icône de  l'éditeur de script

Ou par le menu "*Fenêtre*" --> "*Bibliothèque*". dans l'éditeur de script, tu peux ajouter ou supprimer des applications à partir de cette fenêtre, double-clic pour ouvrir un dictionnaire



NoAPM a dit:


> Sinon comment adapter la fenêtre a la totalité de l'ecran sans faire du full screen ?


En spécifiant sa dimension dans le  bounds de la fenêtre, exemple

```
tell application "TextEdit"
	activate
	make new document
	set bounds of front window to {0, 0, 1600, 1024}
end tell
```

Edition :
Il y a aussi les commandes de l'osax "*StandardAdditions.osax*"

Regarde son dictionnaire, il est dans le dossiers "*ScriptingAdditions*" du dossier "Bibliothèque" du dossier "Système"


----------



## NoAPM (7 Avril 2011)

Génial ! 

Mais je me suis rendu compte que la fenêtre ne suivait plus le déroulement du texte, (il reste en haut). j'ai cherché dans les liens que tu m'as donné mais je ne trouve pas ...

Sinon j'ai essayé de faire une version pour writeroom (pour le pleine écran) mais je n'arrive pas a delete le texte a la fin de la boucle, les raccourcis de ce logiciel ne sont vraiment pas habituel ...

Et dernière question, si je veux adapter a une fenêtre dont je ne connais pas la resolution maximum, y a t'il une solution ?


----------



## Anonyme (7 Avril 2011)

Bonjour,



NoAPM a dit:


> Mais je me suis rendu compte que la fenêtre ne suivait plus le déroulement du texte, (il reste en haut).


il n'y a pas de commande dans TextEdit pour cela, il faut utiliser le keystroke.



NoAPM a dit:


> Sinon j'ai essayé de faire une version pour writeroom (pour le pleine écran) mais je n'arrive pas a delete le texte a la fin de la boucle, les raccourcis de ce logiciel ne sont vraiment pas habituel


Je ne sais pas, sauf de sélectionner les lignes avec la souris et presser la touche de suppression.




NoAPM a dit:


> Et dernière question, si je veux adapter a une fenêtre dont je ne connais pas la resolution maximum, y a t'il une solution ?


Il y a diverses solutions qui ont des inconvénients, si la machine n'as qu'un seul écran (bounds of window of desktop) fonctionne.

Aussi, *TextEdit* est scriptable pour ajouter des lignes, c'est mieux que d'ajouter tout le texte.

Voici le script.

```
tell application "Finder" to set tBounds to bounds of window of desktop
tell application "TextEdit"
	activate
	set tDoc to make new document
	set bounds of front window to tBounds
end tell

set actionDuVent to {"module la surface d'un océan, d'une mer ou d'un lac, il crée une agitation sous la forme d'une succession de vagues", "siffle sur les longues pales blanches en epoxy des éoliennes", "polie les roches", "gonfle les voiles des bateaux", "soulève tes cheveux", "renverse un pot de géranium", "atteint 1400 km/h sur Neptune", "s'engouffre dans les manches rouge et blanche", "s'appel Eole ", "est provoqué par un réchauffement inégalement réparti à la surface de la planète par l&#8217;énergie solaire, et par la rotation de la planète."}

set d to current date
repeat
	set randomAction to some item of actionDuVent
	set aText to (" " & (current date) & " A ce moment précis, Il " & randomAction) & return
	tell application "TextEdit" to make new paragraph at end of paragraphs of text of tDoc with data aText
	tell application "System Events" to keystroke (ASCII character 31) -- fléche en bas, scroll si besoin
	
	if (current date) - d > 30 then exit repeat
	delay 0.1
end repeat
```


----------



## NoAPM (7 Avril 2011)

Tip top pour l'instant c'est génial !


----------

