6 votos

Pulsación de teclas AppleScript que ignora los números

Un AppleScript muy simple como este:

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

resulta en que sólo se escriba "abc". Los recursos en línea sugieren que este no debería ser el caso. Añadir un retardo entre las pulsaciones de las teclas no ayudó.

¿Qué puede estar causando esto o cómo puedo determinar qué puede estar causando esto?

Pequeña pregunta al margen: en la terminología de AppleScript, ¿qué es una pulsación de tecla? ¿Una función, un comando, algo más?

0 votos

Qué tipo de teclado tienes. Lo único que se me ocurre es algo así como un bloqueo de números (aunque me sorprendería que aunque lo tuvieras puesto afectara al comando de pulsación de teclas)

0 votos

Estoy en un MacBook Pro, no hay bloqueo numérico. También, me olvidé de mencionar que durante bastante tiempo tuve un AppleScript que era 'keystroke'ing números.

6voto

Tetsujin Puntos 23061

Echa un vistazo a https://stackoverflow.com/questions/18136567/applescript-keystroke-not-behaving-as-expected y la lista de códigos ANSI en ¿Cómo puedo automatizar la pulsación de una tecla en AppleScript?

Parece que no eres el único con el problema. Una de las soluciones de allí era utilizar el código de la llave en su lugar...

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

Puede depender de la aplicación a la que estés tratando de enviar las pulsaciones - Acabo de probar con un documento en blanco ya abierto en Text Edit usando

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

& ha funcionado como se esperaba.

Una pulsación de tecla es el equivalente a pulsar realmente esa/esas teclas

¿Qué tal si...

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

0 votos

Buena captura en esa pregunta, sí que suena relacionado. Puedo conseguir que el código de teclas envíe números, pero incluso el AppleScript exacto que has publicado no escribe los números.

0 votos

Qué pasa si envías "código de tecla {83}" "código de tecla {84}" "código de tecla {85}" que son las teclas del teclado numérico, o 18 19 20, que son los números que están encima de las letras.

0 votos

Creo que es lo que había hecho después de leer tu respuesta y los enlaces pero sinceramente a estas alturas se me olvida. Fue un poco incómodo pero funcionó.

5voto

Lockie Puntos 636

Algo más de información sobre este tema que he descubierto es que cuando se utiliza keystroke con números, el Sistema de Eventos siempre los envía como ANSI_Keypad# caracteres (código 82-92) en lugar de lo que cabría esperar como ANSI_# caracteres (código 18-29).

Para la mayoría de las aplicaciones de Mac, esto no importa, ya que el propio OS X no se preocupa por (usar, apoyar, etc) el NUMLOCK en un teclado, por lo que los números del teclado se ven igual que los números del teclado. Sin embargo, pasará el NUMLOCK a la aplicación si tiene un teclado/teclado que tenga esta tecla.

Hay algunas aplicaciones que sí controlan el NUMLOCK (por ejemplo, la aplicación VMware Fusion cuando se ejecuta una VM de Windows) y cambiará el comportamiento en función del NUMLOCK estado.

Así, por ejemplo, si el AppleScript envía keystroke "456" a un NUMLOCK aplicación consciente.

  • Si el NUMLOCK El estado es ON aparecerán los números "456".
  • Si el NUMLOCK El estado es OFF las claves equivalentes recibidas son Left Arrow 5 Right Arrow

En la pregunta original, el AppleScript enviaba abc 123 pero lo más probable es que su aplicación (que no se mencionó) fuera consciente de la NUMLOCK estado, que actualmente era OFF y, por lo tanto, ejecutó las llaves como abc [space] End Down Arrow Page Down

He creado una pequeña función AppleScript que recorre la cadena dada enviando key code para cualquier número y keystroke comandos para cualquier otro personaje.

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)

Que ejecuta lo siguiente

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

Espero que esto ayude :)

0 votos

Gracias. Estaba teniendo este problema con un AppleScript que estaba usando para enviar el contenido del portapapeles a una VM Parallels como pulsaciones de teclas, ¡y me llevó un tiempo descubrir que el problema era NumLock! Usando tu función con numberAsKeycode(the clipboard as text) ha funcionado.

1voto

hepcat72 Puntos 103

Al igual que @user271866, yo tenía este problema y descubrí que lo que afectaba al comportamiento de la pulsación de las teclas era la activación de las teclas del ratón en las Preferencias del Sistema.

Tenía un servicio de automatización que había estado utilizando para introducir términos de búsqueda en spotlight y copiar y pegar el resultado. Cuando conseguí un nuevo ordenador, instalé el servicio. Recordé también haber activado las teclas del ratón durante la instalación y, por suerte, antes de ejecutar el servicio hoy en este nuevo ordenador, la batería de mi Magic Mouse 2 se agotó y utilicé las teclas del ratón para conectar mi viejo Magic Mouse. Entonces me encontré con un comportamiento errático del servicio cuando lo probé. Por una corazonada, probé a desactivar las teclas del ratón y a ejecutar el servicio y ¡funcionó! Pegó los números junto con el resto de la cadena.

Hay que tener en cuenta que no se trata sólo de números. Otros caracteres del teclado numérico (pero no todos) tampoco serán "tecleados" por keystroke . . y / tampoco funcionará en una cadena suministrada a keystroke. Por lo tanto, he modificado el código de @Insomniac_Software para crear un reemplazo / envoltura de trabajo para la función de pulsación de teclas:

--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

Ahora, si llamas a my keystrokeForMouseKeys("./0123456789") lo consigues:

./0123456789

Probado en MacOS High Sierra 10.13.6.

0 votos

Ah, sí, también animo a todo el mundo a enviar comentarios a Apple sobre el error en la pulsación de teclas cuando está marcada la opción Activar teclas del ratón. Ya lo he hecho. Cuanta más gente se queje, más probabilidades habrá de que lo arreglen.

0voto

user271866 Puntos 1

¿has comprobado si las teclas del ratón están activadas (Preferencias del Sistema -> Accesibilidad -> Ratón y Trackpad -> Activar teclas del ratón)?

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X