Ejecute AppleScript para un monitor específico

Habilité el dictado para las indicaciones de comando a través de la voz [lo obtuve de la aplicación Chess enviada por el sistema operativo en Lion]. Decidí darle una oportunidad a System Wide ahora en 2015 ejecutando Yosemite. Me gusta hasta ahora, ciertamente se ve mejor y funciona mejor en comparación con Lion (que debería ser el caso) Hay algunas opciones personalizables cuando 'Habilitas comandos avanzados' como abrir archivo, ejecutar flujo de trabajo, abrir aplicación, pegar texto, pegar datos y atajos de teclado.

Sin embargo, llámame perezoso, pero sigue siendo algo que me importa, frecuento Netflix, Hulu y otros sitios web al menos 4 veces al día. Me gustaría agregar un comando funcional que abrirá automáticamente una página web relacionada con ese comando. Dado que el archivo abierto es diferente al archivo de ejecución, estoy tratando de abrir Safari de forma autónoma + el nombre del sitio web en forma de URL con dictado. Lo bueno de esto es que automáticamente convierte cualquier aplicación a la que haga referencia en la ventana más frontal. Por lo tanto, la codificación debe ser mínima, y ​​realmente no quiero crear un servicio para esto [mis servicios están creciendo, actualmente en +55 en total].

Sin embargo, soy un aficionado a Automator y estoy bien versado en él, por lo que estoy usando la herramienta Dictation Command, pero lo que no soy es un erudito de AppleScript. Después de leer la biblioteca de Applescript durante unos 60 minutos, finalmente descubrí cómo abrir una nueva ventana de Safari, activar la aplicación en caso de que no estuviera abierta e iniciar la URL:

tell application "Safari" to activate
    tell application "Safari"
        make new document with properties {URL:"http://netflix.com"}
end tell

Además, tengo 3 monitores. ¡Siempre tengo películas, televisión, etc. en el Número 2! Traté de poner Safari en la pantalla del monitor 2 con applescript, pero como desarrollador de iOS, en conciencia estoy demasiado avergonzado para compartir mi código, es descuidado . ¿Puede alguien dirigirme en la dirección correcta? ¿O alguien sabe una forma más simplificada de solucionar todo esto? De verdad quiero que esto funcione. Estoy en el ejército, por lo que nuestras habitaciones no son tan grandes, por lo que mi segundo monitor (27 ") es mi televisor, por lo que he creado una aplicación para iPhone solo para mis necesidades que simula estrictamente la doble presión necesaria para activar Dictado para poder fnver tv desde mi cama [no tengo apple tv].


EDITAR:Mi objetivo principal es poder usar la activación por voz para completar un sitio web específico de Safari usando Dictado para un monitor específico. No quiero sacrificar mis configuraciones de 'Espacios' o 'Control de misión' ya que he trabajado mucho para que sean beneficiosas para mi flujo de trabajo. Tengo 3 monitores, que están configurados en sucesión (es decir, el monitor 1 y 3 están uno al lado del otro en mi estación de escritorio, el monitor 1 está a la izquierda y el 3 a la derecha, el monitor 2 no está cerca del 1 o 3 que está mirando) mi cama, vea la imagen 1 como referencia. Sin embargo, están configurados en sucesión 1 va a 2, 2 va a 3. Tengo espacios configurados donde aplicaciones específicas usan el monitor número 3 exclusivamente (Xcode), lo que no lo hace tanto Por complicado que parezca, es por eso que no quiero sacrificar la configuración de mis espacios porque uso 2 como mi "TV" dedicada, esto no es

FOTO 1:foto1


La sugerencia de miken32 funciona, pero solo para mostrarla, no para minimizarla. Minimizar es importante, porque tendré que minimizar el sitio web activo de Safari, digamos Hulu, solo para abrir Netflix porque las aplicaciones de pantalla completa no se pueden superponer. Así que inevitablemente haré otra activación por voz o minimizaré de otra manera para poder transferir sitios web sin dirigibles. Nota: a veces no quiero cerrar, a veces guardo mi lugar, por lo que minimizar es un buen recurso para mí. Esto es lo que sucede con miken32: minimiza pero creo que está tratando de volver a los orígenes que establecimos en el script, pero negativamente como en (-). NOTA: Sé que los orígenes que ves en el applescript de la película no reflejan el origen absoluto de mi monitor específico, cambié los orígenes para probar, pero para grabar la película tuve que ponerla en esa pantalla, así que la dejé como está para que puedas ver a dónde va cuando minimizas. ¡Aparte de eso, funciona muy bien por la cantidad de código! Me alegro de que hayan incluido la opción de pantalla completa incluso cuando no la pedí, eso es absolutamente lo que tenía en mente, pero no quería molestar a nadie que intentara averiguarlo, mi objetivo principal era simplemente lograrlo. el segundo monitor.

https://www.dropbox.com/s/jvmtnhh30hqmd36/answer1.mov?dl=0


La respuesta de Markhuntes funciona a la perfección, la cantidad de tiempo que tardó en cargarse en la primera ejecución fue de unos 15 segundos, no hay de qué preocuparse, pero definitivamente no es óptimo para el uso diario, sin embargo, las ejecuciones posteriores fueron mínimas (3-6 segundos como máximo). Lo que me gusta de su sugerencia es que encuentra automáticamente el segundo monitor en lugar de tener que codificarlo, lo cual es excelente desde el punto de vista del consumidor, cuanto menos tenga que manipular, mejor, esta es una gran característica para el futuro, digamos que cambio mi configuración o obtengo un monitor de diferente tamaño, etc. No tengo que volver a codificar un origen absoluto. Hay un inconveniente a partir de ahora, voy a jugar con él durante un par de días solo para asegurarme de que no entre en conflicto con mis otras preferencias del sistema. Minimiza donde debería, lo cual es genial, se llena con precisión, pero yo

ALCON - Lea la descripción de la recompensa -
Tal vez desee agregar una oración de resumen al final, solo para dejar en claro qué es exactamente lo que está buscando.
Creo que el título lo dice todo @ miken32 pero np cuando regrese a mi computadora lo actualizaré y te etiquetaré

Respuestas (2)

Este script en un comando de Dictado de Automator parece funcionar.

No, la pantalla completa no funcionará correctamente si se ejecuta en Automator o en el editor de scripts. Recoge la ventana anterior 1.

Pero en cualquier momento conseguí que funcionara el comando Dictado. (siempre encuentro un poco de dolor para que me entiendan) Obtuvo la ventana correcta al 100%.

Este script usa el perfilador del sistema para obtener los monitores. y un poco de truco simple para usar el ancho del monitor 1 para determinar dónde están los límites del monitor dos.

Lo hice de esta manera porque puede optar por no usar la pantalla completa

También he intentado que el script sea accesible para personas con un solo monitor.

set theScreens to paragraphs of (do shell script "system_profiler SPDisplaysDataType -detailLevel |grep \"Resolution:\" | awk -F\"Resolution: \" '{print $2}'")
set theMonitor to ""

set the counter to count of theScreens --- set to 1 if you want to test it on monitor 1
if (counter) > 1 then
    -- we will do things for monitor 2
    set thisDisplayWidthHeightMonitor_2 to {(word 1 of item 1 of theScreens) + 2, 0, ((word 1 of item 1 of theScreens) + (word 1 of item 2 of theScreens)), word 3 of item 2 of theScreens}
    set theMonitor to thisDisplayWidthHeightMonitor_2
else
    -- we will do things for monitor 1
    set thisDisplayWidthHeightMonitor_1 to {0, 0, (word 1 of item 1 of theScreens), (word 3 of item 1 of theScreens)}
    set theMonitor to thisDisplayWidthHeightMonitor_1
end if

tell application "Safari"
    activate
    make new document with properties {URL:"http://netflix.com", index:1}

    set bounds of window 1 to theMonitor

end tell

tell application "System Events"
    tell application process "Safari"
        set value of attribute "AXFullScreen" of window 1 to true
    end tell
end tell
Bueno, no voy a ser uno de esos idiotas que rechaza las respuestas de la competencia sin una buena razón;) Pero... Señalaré que esto es considerablemente más lento que mi respuesta debido a la llamada del script de shell y al segundo monitor. bit no funciona en los casos en que los monitores no están alineados de manera ordenada. Por ejemplo, tengo mi pantalla secundaria arriba ya la izquierda de mi pantalla principal, de ahí los números negativos en mi respuesta.
Sí. Yo esperaría que sí. No es tanto la llamada del script de shell. Más la llamada a system_profiler. Que es lento. Pero funciona lo suficientemente rápido como para no ser un problema. El operador no dice cómo están dispuestos sus monitores y solo tengo dos monitores uno al lado del otro. Pero en realidad, esta es solo otra forma de tener una idea de algunas opciones.
@ miken32 mira, ya encontraste algo útil set value of attribute "AXFullScreen" of first window to true:-)
¡Hice! Intenté eso primero pero olvidé el "de la primera ventana" y no pude entender por qué estaba recibiendo un error.
@ miken32 para ser honesto, el diseño no es un problema, probablemente sea lo más fácil de modificar en esta circunstancia. Respectivamente, me gustaría tomarme mi tiempo con esto ya que acabo de revelar toda mi reputación, todavía estoy en el trabajo [hora de Alaska aquí], así que solucionaré los problemas cuando llegue a casa. Gracias a los dos por sus respuestas -
@markhunte sí, tiene dificultades para captarlo con el micrófono incorporado. Sin embargo, hablo mucho por Skype con mi familia debido a las mudanzas militares a menudo, así que tengo un excelente micrófono de Skype que hace un trabajo muy bueno al captar las palabras habladas en toda la sala. Gracias por tu respuesta. Tengo muchas ganas de llegar a casa y probar estos
@soulshined, por curiosidad, ¿cómo envía su aplicación iOS el evento clave a la Mac?
@markhunte simplemente habilite una VPN personal y simule un código clave, presione 63 dos veces entre un retraso de 0.1 importando algunos marcos que se relacionan bien con iOS y Mac, como lo hace la mayoría ahora, pero estoy buscando incluir el micrófono de mi iPhone para ser el delegado para este proceso, pero ese es un tema diferente. Podría simplemente agregar botones a la aplicación para cada sitio web respectivo. Probablemente la ruta más sensata a tomar.
Gracias por su respuesta @markhunte - ver pregunta revisada
Bien hecho, gracias por su arduo trabajo y ayudarme con este proyecto con una conclusión de calidad profesional. Actualicé el título de mi pregunta para reflejar mejor su respuesta, con la esperanza de que la gente lo vote en el futuro con la misma pregunta (como si eso sucediera alguna vez) @markhunte
@soulshined Gracias por sus comentarios. Me alegro de que te haya funcionado tan bien. Avíseme si necesita más ayuda y espero poder hacerlo.
¿Supongo que se suponía que la palabra "Resolución" aparecía x veces para x monitores? No funcionó para mí. ¿Podría deberse a los permisos de administrador bloqueados (es decir, no tengo ninguno) o al uso de una estación de acoplamiento externa?

Tomaré mi comentario y lo convertiré en una respuesta; asumiendo que entiendo lo que estás buscando al menos.

Probé este código y funciona bien para mí. Deberá ajustar los números para indicar la posición relativa de su monitor. Suponiendo que no mueva sus pantallas, es una entrada única.

Crédito a esta respuesta en SO que también proporciona un enlace a una utilidad para obtener los detalles de la posición de la pantalla.

# this needs to be a position on the desired monitor
set monitorPosition to {-1920, -1380}

tell application "Safari"
    activate
    make new document with properties {URL:"http://netflix.com"}
end tell

tell application "System Events"
    tell process "Safari"
        set position of first window to monitorPosition
        set value of attribute "AXFullScreen" of first window to true
    end tell
end tell