8 votes

Est-il possible de saisir des caractères spéciaux dans AppleScript ?

L'insecte :

Pour certains caractères et symboles spéciaux, AppleScript ne parviendra pas à keystroke le caractère réel, et tapera simplement la lettre a .


Un exemple :

Le code AppleScript suivant :

tell application "System Events" to keystroke "² ³ é ½ "

tape la chaîne de texte suivante (quelle que soit l'application dans laquelle je me trouve) :

a a a a a

Une solution de rechange :

On peut efficacement "taper" le texte en plaçant les caractères spéciaux dans le presse-papiers, puis en collant le presse-papiers, comme suit :

set the clipboard to "² ³ é ½ "
tell application "System Events" to keystroke "v" using command down

J'évite d'utiliser la méthode ci-dessus pour placer du texte dans le presse-papiers en AppleScript, car elle convertit nécessairement le presse-papiers en texte enrichi.

Je préfère employer la méthode fournie ici pour s'assurer que le texte en clair est placé dans le presse-papiers. Mais cette méthode convertit les caractères spéciaux en mojibake.

Par exemple, en utilisant la même chaîne que ci-dessus, cette méthode place le texte suivant dans le presse-papiers :

¬ ¬ © ¬ ‚Ç

Vous pouvez toutefois tenir compte manuellement de ce problème en ajoutant un paramètre replace_chars pour chaque caractère spécial.


La question :

Existe-t-il un moyen de taper des caractères spéciaux via AppleScript, sans de faire intervenir le presse-papiers ?

Par exemple, existe-t-il un moyen d'ajouter les caractères spéciaux souhaités à une "banque" ou à un fichier système quelque part, de sorte que l'application System Events L'application les connaît bien ?


11voto

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 ..." enter image description here


2- Sélectionner MacOS y Outil de ligne de commande , cliquez sur le bouton " Suivant bouton ". enter image description here


3- Le nommer TypeCharacters , sélectionner Objectif-C comme Langue, cliquez sur le bouton " Suivant bouton ". enter image description here


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 .

enter image description here


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.

enter image description here


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

7voto

Une solution de contournement (avec le presse-papiers) :

1 - Vous pouvez utiliser une méthode de cacao à partir d'un coquillage :

set tString to "² ³ é ½ "
my stringToClipboard(tString)
tell application "System Events" to keystroke "v" using command down

on stringToClipboard(t1)
    do shell script "/usr/bin/python -c 'import sys;from AppKit import NSPasteboard, NSPasteboardTypeString; cb=NSPasteboard.generalPasteboard();cb.declareTypes_owner_([NSPasteboardTypeString], None);cb.setString_forType_(sys.argv[1].decode(\"utf8\"), NSPasteboardTypeString)' " & quoted form of t1
end stringToClipboard

2 - Ou une applet Cocoa-AppleScript :

use framework "AppKit"
use scripting additions
set tString to "² ³ é ½ "
my stringToClipboard(tString)
tell application "System Events" to keystroke "v" using command down

on stringToClipboard(t1)
    set ca to current application
    set cb to ca's NSPasteboard's generalPasteboard()
    cb's declareTypes:{ca's NSPasteboardTypeString} owner:(missing value)
    cb's setString:t1 forType:(ca's NSPasteboardTypeString)
end stringToClipboard

3voto

Afin de keystroke un caractère, ce caractère doit être associé à une touche réelle du clavier sélectionné.

Par exemple, je peux keystroke é y ² car j'utilise l'outil d'évaluation de la qualité de l'eau. Français - PC la disposition du clavier. Toutefois, un clavier américain QWERTY standard ne comporte pas ces touches et ne permet pas d'effectuer les opérations suivantes keystroke les.

2voto

wch1zpink Points 6067

Vous pouvez définir tous vos jeux de caractères spéciaux en tant que variables, comme suit

on specialKeys(input)
    tell application "System Events"
        keystroke input
    end tell
end specialKeys

set characterSet1 to "²³é½ "
set characterSet2 to "¬ "
set characterSet3 to "© "
set characterSet4 to "¬ "
set characterSet5 to "‚Ç "
set characterSet6 to characterSet1 & characterSet2 & characterSet3 & characterSet4 & characterSet5

specialKeys(characterSet1)
-- ² ³ é ½  is the result from calling specialKeys(characterSet1) After adding the text replacement for “a a a a a” in my keyboard preferences

Certains caractères spéciaux se frappent correctement lorsque vous les définissez en tant que variables. Si l'un des caractères spéciaux que vous avez définis comme variables ne se tape pas correctement, vous pouvez ajouter des "remplacements de texte" dans les préférences système de votre clavier.

Veillez à sélectionner tous les éléments et à les faire glisser sur votre bureau ou ailleurs. Cela créera un fichier .plist qui constituera une sauvegarde de vos paramètres d'origine. Vous pourrez faire glisser ce fichier à tout moment.

enter image description here

enter image description here

Ensuite, dans ScriptEditor, assurez-vous que les remplacements de texte sont activés dans le sous-menu "substitutions" du menu d'édition.

enter image description here

enter image description here

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X