7 votes

Touche AppleScript ignorant les chiffres

Un AppleScript très simple comme celui-ci :

tell application "System Events"
    keystroke "abc 123"
end tell

se traduit par la saisie de "abc". Les ressources en ligne suggèrent que cela ne devrait pas être le cas. L'ajout d'un délai entre les frappes n'a pas aidé.

Quelle en est la cause ou comment puis-je la déterminer ?

Petite question annexe : dans la terminologie AppleScript, qu'est-ce qu'une touche ? Une fonction, une commande, quelque chose d'autre ?

7voto

Tetsujin Points 95239

Jetez un coup d'œil sur https://stackoverflow.com/questions/18136567/applescript-keystroke-not-behaving-as-expected & la liste des codes ANSI à l'adresse Comment automatiser une pression de touche dans AppleScript ?

Il semble que vous ne soyez pas le seul à être confronté à ce problème. L'une des solutions proposées consistait à utiliser le code clé à la place...

tell application "System Events"
    key code {18} using {command down}

Cela peut dépendre de l'application à laquelle vous essayez d'envoyer les frappes - j'ai testé avec un document vierge déjà ouvert dans Text Edit en utilisant

tell application "TextEdit" to activate
tell application "System Events"
    keystroke "abc 123"
end tell

& il a fonctionné comme prévu.

Une frappe est l'équivalent scénarisé de l'action d'appuyer sur cette/ces touche(s)

Que diriez-vous de...

tell application "TextEdit" to activate
tell application "System Events"
    keystroke "abc"
    keystroke space
    keystroke "123"
end tell

5voto

Insomniac Software Points 1843

J'ai découvert une information supplémentaire sur ce problème : lorsque l'on utilise la fonction keystroke avec des nombres, les System Events les envoient toujours sous forme de ANSI_Keypad# (code 82-92) au lieu de ce que l'on pourrait attendre d'un ANSI_# caractères (code 18-29).

Pour la plupart des applications Mac, cela n'a pas d'importance car OS X lui-même ne se préoccupe pas (utilisation, support, etc.) de l'élément NUMLOCK fonctionnent sur un clavier, les chiffres du clavier sont donc considérés comme les mêmes que ceux du clavier. Cependant, la fonction transmettra la valeur NUMLOCK à l'application si vous disposez d'un clavier qui possède cette touche.

Il existe quelques applications qui surveillent la NUMLOCK (par exemple, l'application VMware Fusion lors de l'exécution d'une VM Windows) et modifiera le comportement en fonction de la touche NUMLOCK état.

Ainsi, par exemple, si l'AppleScript envoie keystroke "456" à un NUMLOCK application consciente.

  • Si le NUMLOCK L'État est ON , les chiffres "456" s'affichent.
  • Si le NUMLOCK L'État est OFF les clés équivalentes reçues sont Left Arrow 5 Right Arrow

Dans la question initiale, l'AppleScript envoyait abc 123 mais il est très probable que sa demande (qui n'a pas été mentionnée) ait été informée de l'existence de l'accord. NUMLOCK qui est actuellement en cours d'exécution. OFF et a donc exécuté les clés comme suit abc [space] End Down Arrow Page Down

J'ai créé une petite fonction AppleScript qui parcourt en boucle la chaîne donnée en envoyant key code pour n'importe quel nombre et keystroke pour tout autre caractère.

on numberAsKeycode(theString)
  tell application "System Events"
    repeat with currentChar in (every character of theString)
      set cID to id of currentChar
      if ((cID  48) and (cID  57)) then
        key code {item (cID - 47) of {29, 18, 19, 20, 21, 23, 22, 26, 28, 25}}
      else
        keystroke currentChar
      end if
    end repeat
  end tell
end numberAsKeycode

set myString to "abc 123"
numberAsKeycode(myString)

Qui exécute ce qui suit

tell application "System Events"
  keystroke "a"
  keystroke "b"
  keystroke "c"
  keystroke " "
  key code {18}
  key code {19}
  key code {20}
end tell

J'espère que cela vous aidera :)

1voto

hepcat72 Points 1077

Comme @user271866, j'ai eu ce problème et j'ai découvert que c'était l'option "Activer les touches de la souris" cochée dans les préférences système qui affectait le comportement des touches.

J'avais un service d'automatisation que j'utilisais pour entrer des termes de recherche dans Spotlight et copier-coller le résultat. Lorsque j'ai eu un nouvel ordinateur, j'ai installé le service. Je me souvenais avoir activé les touches de la souris lors de l'installation et, par chance, avant de lancer le service aujourd'hui sur ce nouvel ordinateur, la batterie de ma Magic Mouse 2 est morte et j'ai utilisé les touches de la souris pour connecter mon ancienne Magic Mouse. J'ai alors rencontré un comportement erratique de la part du service lorsque je l'ai essayé. Par intuition, j'ai essayé de désactiver les touches de la souris et d'exécuter le service, et cela a fonctionné ! Il a collé les chiffres avec le reste de la chaîne.

Il convient de noter qu'il ne s'agit pas seulement de chiffres. D'autres caractères du clavier numérique (mais pas tous) ne seront pas non plus "tapés" par les keystroke . . y / ne fonctionne pas non plus dans une chaîne de caractères fournie à la frappe. J'ai donc modifié le code de @Insomniac_Software pour créer un remplaçant fonctionnel pour la fonction keystroke :

--This is a replacement for the keystroke function, which fails when "Enable Mouse Keys" is checked in System Preferences -> Accessibility -> Mouse & Trackpad.  Keystroke will not "type out" any numbers, a dot ('.') or a slash ('/') that are in the supplied string when this option is enabled in System preferences.  This method is safe to use whether that setting is checked or not.  Call like this: my keystrokeForMouseKeys("your string")
on keystrokeForMouseKeys(theString)
    tell application "System Events"
        repeat with theChar in (every character of theString)
            set theCode to id of theChar
            if theCode is 44 then
                key code 44
                --Not sure why 46 (m) is what you get when you call id on "." but key code 47 types a "." and key code 46 types an 'm'...
            else if theCode is 46 then
                key code 47
            else if ((theCode  48) and (theCode  57)) then
                key code {item (theCode - 47) of {29, 18, 19, 20, 21, 23, 22, 26, 28, 25}}
            else
                keystroke theChar
            end if
        end repeat
    end tell
end keystrokeForMouseKeys

Maintenant, si vous appelez my keystrokeForMouseKeys("./0123456789") vous obtenez :

./0123456789

Testé sur MacOS High Sierra 10.13.6.

0voto

user271866 Points 1

Avez-vous vérifié si les touches de la souris sont activées (Préférences système -> Accessibilité -> Souris et Trackpad -> Activer les touches de la souris) ?

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