¿Cómo puede encontrar qué monitor tiene la barra de menú en AppleScript?

2

Jugando con AppleScript Quiero manipular la ubicación de algunas ventanas con position pero tengo un problema al definir el monitor. Actualmente tengo varios monitores de diferentes tamaños y marcas a los que me conecto con mi MacBook durante mis viajes. Lo único que se repite con los cuatro monitores a los que me conecto es que el monitor que quiero manipular incluye la barra de menú.

Al realizar pruebas con do shell script "system_profiler SPDisplaysDataType , no estoy seguro de si el texto devuelto de Main Display: Yes considera que el principal es donde se encuentra la barra de menú de la extracción:

Graphics/Displays:

    Intel Iris Pro:

      Chipset Model: Intel Iris Pro
      Type: GPU
      Bus: Built-In
      VRAM (Dynamic, Max): 1536 MB
      Metal: Supported
      Displays:
        Color LCD:
          Display Type: Built-In Retina LCD
          Resolution: 2880 x 1800 Retina
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: Yes
          Connection Type: DisplayPort
        Thunderbolt Display:
          Display Type: LCD
          Resolution: 2560 x 1440
          Main Display: Yes
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: No
          Connection Type: DisplayPort

Si mi suposición de Main Display es correcta, ¿cómo debo obtener correctamente la resolución de la pantalla principal identificada para poder manipular las ventanas?

Cuando investigo, aparecerá un poco en cada pantalla:

Así que no sé si esto sería dos preguntas en una. Estoy algo confundido sobre cómo se determina la secuencia cuando se conecta a varios monitores (como hoy podría estar conectado a una pantalla de rayo pero mañana podría estar conectado a dos monitores Dells a través de mis dos DisplayPorts) y si hay una manera de Dirigirse a un monitor en particular basado en la barra de menú.

Ya puedo detectar la aplicación y su tamaño con:

tell application "System Events" to tell application process "Notes" to set theSize to get size of window 1
set theWidth to item 1 of theSize
set theHeight to item 2 of theSize

pero mi problema es en la determinación de la resolución, por lo que puedo calcular el position y bounds para mover la ventana de la aplicación.

    
pregunta ʀ2ᴅ2 24.10.2017 - 19:13

3 respuestas

2

ACTUALIZAR

Eliminado mi respuesta original. Aquí hay un enfoque completamente diferente que prefiero sobre mi solución original. Esta versión realmente utiliza la adición de secuencias de comandos "Eventos de imagen".

Este script obtendrá los nombres de las pantallas conectadas a su computadora. Los valores devueltos de "pantalla" Pantalla 1 siempre serán "¿qué monitor tiene la barra de menú en AppleScript?"

property activeDesktop : missing value
property activeDesktopResolution : missing value

set displayNames to {}

tell application "Image Events"
    set theDisplays to displays
    repeat with i from 1 to number of items in theDisplays
        set this_item to item i of theDisplays
        set theName to name of display profile of item i of theDisplays
        set end of displayNames to theName
        set activeDesktop to item 1 of displayNames
    end repeat
end tell

tell application "Finder"
    set activeDesktopResolution to bounds of window of desktop
    set activeDesktopResolution to items 3 thru 4 of activeDesktopResolution
end tell

set theResultz to display dialog activeDesktop & "  " & item 1 of activeDesktopResolution & " x " & item 2 of activeDesktopResolution ¬
    buttons ¬
    "OK" with title ¬
    "Your Current Display and Its Resolution" with icon 1 ¬
    giving up after 10

    
respondido por el wch1zpink 27.10.2017 - 00:48
2

En mi prueba, está en lo correcto de que la pantalla principal es la que tiene el menú asignado en Pantallas de preferencias del sistema. Probé moviendo la barra de menú de una pantalla a otra y ejecutando su script. Los resultados sugieren que dondequiera que esté la barra de menú, esa pantalla tendrá "Pantalla principal: Sí" en su información.

Para analizar la resolución, usaría el argumento -xml para el comando system_profiler para obtener un texto coherente para buscar y luego utilizar los delimitadores de elementos de texto de Apple para analizar los datos. Escribí este script, y cuando cambio el menú de un lado a otro, devuelve la resolución de la pantalla principal actual. Es posible que deba ajustar los delimitadores según lo que devuelva su sistema operativo para el informe del generador de perfiles del sistema.

Agregué comentarios en línea en el código a continuación para explicar lo que hace el script.

set pfl to do shell script "system_profiler -xml SPDisplaysDataType"

set tid to text item delimiters
set text item delimiters to "</data><key>_name</key>"--in my reports, each display section starts with this xml code

ignoring white space --allows us to not worry about returns, tabs, spaces, etc.
    repeat with i from 2 to count of pfl's text items
        set aDisplay to pfl's text item i
        if aDisplay contains "<key>spdisplays_main</key><string>spdisplays_yes</string>" then--check if this display is the main
            set text item delimiters to "<key>_spdisplays_resolution</key><string>"--this is the xml code for the resolution
            set displayRes to aDisplay's text item 2
            set text item delimiters to "</string"--remove the ending xml code
            set displayRes to displayRes's text item 1
        end if
    end repeat
end ignoring
set text item delimiters to tid --always text text item delimiters back to default
return displayRes

EDITAR: Debido a que publicaste la forma regular del system_profiler anterior, reescribí el script para analizar esa salida. Me parece un poco más riesgoso que usar el xml, pero debería compilarse y ejecutarse correctamente en tu sistema sin ningún tipo de ajustes.

set pfl to do shell script "system_profiler SPDisplaysDataType"
set tid to text item delimiters
set text item delimiters to "Displays:"
set pfl to text item 3 of pfl
set text item delimiters to "Mirror:"
repeat with i from 1 to count of pfl's text items
    set aDisplay to pfl's text item i
    ignoring white space
        if aDisplay contains "Main Display: Yes" then
            if aDisplay contains "Resolution:" then
                set text item delimiters to "Resolution: "
                set displayRes to text item 2 of aDisplay
                considering white space
                    set text item delimiters to "\r" --line breaks should be \r
                    set displayRes to text item 1 of displayRes
                    set text item delimiters to "\n" --or they might be \n
                    set displayRes to text item 1 of displayRes
                end considering
            end if
        end if
    end ignoring
    set text item delimiters to "Mirror:"
end repeat
set text item delimiters to tid
return displayRes
    
respondido por el Hurston 24.10.2017 - 21:24
2

Probado en mi MacBook Pro con una Thunderbolt Display adjunta y la Barra de menú , funcionó lo siguiente:

set theMainDisplayName to do shell script "system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'"
return theMainDisplayName

Result:
"Thunderbolt Display:"

Si cambio la Barra de menú a MacBook Pro , devuelve el nombre de la Pantalla de en lugar del nombre de la Thunderbolt Display .

Para la Resolución de mi Thunderbolt Display :

set theMainDisplayResolution to do shell script "system_profiler SPDisplaysDataType | grep -B 3 'Main Display:' | awk '/Resolution:/{print $2,$3,$4}'"
return theMainDisplayResolution

Result:
"2560 x 1440"

Si cambio la Barra de menú a MacBook Pro , devuelve la resolución de la Pantalla de en lugar de la resolución de la Thunderbolt Display .

También, mire mis respuestas a Script para reubicar la barra de menú en la configuración de monitores duales y Cambiar la disposición de la pantalla en OS X programáticamente para un par de utilidades de terceros También puede ser útil.

Nota: No tengo ninguna afiliación con los desarrolladores de las utilidades mencionadas y utilizadas en mis respuestas en los enlaces anteriores.

Comprender un poco acerca de los comandos de shell utilizados en do shell script commands:

Parte del comando del comando do shell script :

system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'
  • system_profiler : informa sobre la configuración del hardware y software del sistema.
    • SPDisplaysDataType: genera un informe de texto que solo contiene gráficos y pantallas.
  • | Pipe para dirigir salida del comando a entrada del siguiente comando .
  • grep - Buscador de patrones de archivo. La utilidad grep busca cualquier archivo de entrada dado, seleccionando líneas que coincidan con uno o más patrones.
    • −B num - Imprime num líneas del contexto principal antes de cada coincidencia.
    • 'Main Display:' patrón a coincidir.
  • | Pipe para dirigir salida del comando a entrada del siguiente comando .
  • awk - Lenguaje de procesamiento y escaneo dirigido por patrón.
    • sub(/^[ \t]+/, \"\") - Función de cadena de sustitución - sub(regexp, replacement) - Se usa en esta instancia para eliminar los espacios en blanco iniciales.
      • ^ : afirma la posición al inicio de la cadena.
      • [ \t] - Coincide con un solo carácter presente en la lista.
        • space : hace coincidir el carácter space literalmente. Tenga en cuenta que space se usa aquí para denotar un carácter de espacio único (ASCII 32).
        • \t : hace coincidir un carácter de tabulación (ASCII 9).
      • + : coincide entre uno e ilimitado, tantas veces como sea posible, devolviendo según sea necesario (codicioso).
      • \"\" - El reemplazo no tiene nada ( "" ). Los "" se escapan, \ , por lo que el comando se puede compilar y pasar al shell. Si se ingresa directamente en la línea de comandos, no será necesario escapar "" .
    • print $0 - Imprime el registro completo. - En este caso, imprime la quinta línea sobre Main Display: , san el espacio en blanco inicial.
    • exit : sale después de imprimir el primer registro .

Parte del comando del comando do shell script :

system_profiler SPDisplaysDataType | grep -B 3 'Main Display:' | awk '/Resolution:/{print $2,$3,$4}'

En este comando do shell script , la parte awk '/Resolution:/{print $2,$3,$4}' hace lo siguiente:

La salida de, por ejemplo,

$ system_profiler SPDisplaysDataType | grep -B 3 'Main Display:'
          Resolution: 2560 x 1440
          Pixel Depth: 32-Bit Color (ARGB8888)
          Display Serial Number: C08Z4120F6FB
          Main Display: Yes
$

Obtiene canalizado a awk y busca en input un registro que contenga Resolution: , que encuentra el siguiente registro coincidir:

          Resolution: 2560 x 1440

El comando print $2,$3,$4 , imprime el segundo, tercer y cuarto campos del registro . La coma , entre los campos $n es para insertar un espacio . La salida de la cual es:

2560 x 1440
    
respondido por el user3439894 24.10.2017 - 21:05

Lea otras preguntas en las etiquetas