C'est possible avec CoreGraphics ( CGEventPost
), il s'agit d'un C (cela ne fonctionne pas dans un Cocoa-AppleScript), mais il est possible d'appeler un exécutable à partir d'un AppleScript.
Voici la méthode pour créer l'exécutable avec Xcode (Version 8.3.3) :
Vous pouvez le faire vous-même (vous pouvez télécharger Xcode de la App Store ), ou demander à une personne de confiance de créer l'exécutable.
1- Ouvrez Xcode, sélectionnez le menu " Fichier " --> " Nouveau " --> " Projet ..."
2- Sélectionner MacOS y Outil de ligne de commande , cliquez sur le bouton " Suivant bouton ".
3- Le nommer TypeCharacters
, sélectionner Objectif-C comme Langue, cliquez sur le bouton " Suivant bouton ".
4- Enregistrez le projet dans le dossier souhaité.
5- Dans la fenêtre de Xcode, sélectionnez l'option main.m
effacez le texte de la fenêtre et collez l'un de ces deux codes :
Le code a besoin d'une boucle à cause d'un bug, le CGEventKeyboardSetUnicodeString()
tronque une chaîne qui dépasse vingt caractères, ou bien il s'agit d'une limite (non documentée).
Ce code utilise une boucle pour taper une liste de caractères à chaque itération, la liste pouvant contenir de un à vingt caractères. (C'est rapide, 1 seconde pour taper 2400 caractères dans un document TextEdit sur mon ordinateur).
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
if (argc > 1) {
NSString *theString = [NSString stringWithUTF8String:argv[1]];
NSUInteger len = [theString length];
NSUInteger n, i = 0;
CGEventRef keyEvent = CGEventCreateKeyboardEvent(nil, 0, true);
unichar uChars[20];
while (i < len) {
n = i + 20;
if (n>len){n=len;}
[theString getCharacters:uChars range:NSMakeRange(i, n-i)];
CGEventKeyboardSetUnicodeString(keyEvent, n-i, uChars);
CGEventPost(kCGHIDEventTap, keyEvent); // key down
CGEventSetType(keyEvent, kCGEventKeyUp);
CGEventPost(kCGHIDEventTap, keyEvent); // key up (type 20 characters maximum)
CGEventSetType(keyEvent, kCGEventKeyDown);
i = n;
[NSThread sleepForTimeInterval:0.004]; // wait 4/1000 of second, 0.002 it's OK on my computer, I use 0.004 to be safe, increase it If you still have issues
}
CFRelease(keyEvent);
}
}
return 0;
}
Ce code utilise une boucle pour taper un caractère à chaque itération (il est plus lent que le premier code).
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
if (argc > 1) {
NSString *theString = [NSString stringWithUTF8String:argv[1]];
UniChar uChar;
CGEventRef keyEvent = CGEventCreateKeyboardEvent(nil, 0, true);
for (int i = 0; i < [theString length]; i++)
{
uChar = [theString characterAtIndex:i];
CGEventKeyboardSetUnicodeString(keyEvent, 1, &uChar);
CGEventPost(kCGHIDEventTap, keyEvent); // key down
CGEventSetType(keyEvent, kCGEventKeyUp);
CGEventPost(kCGHIDEventTap, keyEvent); // key up (type the character)
CGEventSetType(keyEvent, kCGEventKeyDown);
[NSThread sleepForTimeInterval:0.001]; // wait 1/1000 of second, no need of this line on my computer, I use 0.001 to be safe, increase it If you still have issues
}
CFRelease(keyEvent);
}
}
return 0;
}
Note : Ce code fonctionne sur MacOS Sierra et devrait travailler sur El Capitan mais pas sur un modèle plus ancien. OS .
6- Sélectionner le menu " Produit " --> " Construire ".
7- Sélectionnez l'option TypeCharacters
dans l'écran d'accueil de la Produit cliquez avec le bouton droit de la souris et sélectionnez l'option " Afficher dans le Finder "dans le menu contextuel.
8- Dans le Finder, déplacez l'icône " Caractères de type "dans le dossier souhaité, quitter Xcode c'est tout.
D'un AppleScript appeler l'exécutable, comme suit
set myString to "ùéèà ² ³ é ½ "
do shell script "'/full path/of/TypeCharacters' " & quoted form of myString