2009-12-08 19 views
5

Ich versuche, die aktuelle Bildschirmauflösung meiner beiden Anzeigen zu erhalten, je nachdem wo sich der Mauszeiger befindet.AppleScript Wie bekomme ich die aktuelle Bildschirmauflösung?

Wenn der Mauszeiger auf der ersten Anzeige ist, möchte ich die Auflösung dieser Anzeige erhalten.

Mit einem Shell-Skript kann ich beiden Auflösungen erhalten:

set screenWidth to (do shell script "system_profiler SPDisplaysDataType | grep Resolution | awk '{print $2}'") 

Aber ich habe nicht die Anzeige derzeit „aktiv“ ist.

Irgendwelche Ideen?

Antwort

8

Applescript hat keinen Zugriff auf die Cursorposition, auch nicht über Systemereignisse. Es tut uns leid.

[Es gibt ein paar kommerzielle Lösungen, aber ich schätze, dass sie in diesem Fall nicht die Mühe wert sind? Ich nehme an, ich könnte auch ein schnelles Befehlszeilenprogramm erstellen, das nur die aktuelle Cursorposition zurückgibt ... lohnt sich das Problem?]

p.s. awk ist groß bei der Suche nach passenden Linien:

set screenWidth to (do shell script "system_profiler SPDisplaysDataType | awk '/Resolution/{print $2}'") 
4

Aus Gründen der Vollständigkeit, hier ist der Code, um die Bildschirmhöhe zu greifen:

do shell script "system_profiler SPDisplaysDataType | awk '/Resolution/{print $4}'"} 
6

Dies funktioniert der Trick:

tell application "Finder" 
set screen_resolution to bounds of window of desktop 
end tell 
+2

Das nur mit einem einzigen Display arbeitet. – user495470

+0

Bei mehreren Anzeigen gibt "Fenstergrenzen des Desktops" eine * einzelne, kombinierte * Größe an, die das * umschließende Rechteck um alle Anzeigen * ist, basierend auf ihrer räumlichen Anordnung, wie in den Systemeinstellungen definiert. Mit anderen Worten: Sie können nicht sagen, wie viele Anzeigen vorhanden sind und das angezeigte Rechteck kann Bereiche enthalten, die nicht tatsächlich angezeigt werden können. In ähnlicher Weise melden sowohl die 'Fenster'-Objekte der Standard Suite (Fenster von AppleScript-fähigen Anwendungen über 'Grenzen') als auch die 'Fenster-Objekte' von Process Suite (Kontext '' Systemereignisse '' über 'Position') ihre Koordinaten kombiniertes Rechteck – mklement0

3

Das Folgende löst das Problem des OPs nicht, aber es kann hilfreich sein, wenn Sie die Auflösung aller angebrachten Anzeigen in AppleScript ermitteln möchten. (Danke an @JoelReid und @ iloveitaly für die Bausteine):

set resolutions to {} 
repeat with p in paragraphs of ¬ 
    (do shell script "system_profiler SPDisplaysDataType | awk '/Resolution:/{ printf \"%s %s\\n\", $2, $4 }'") 
    set resolutions to resolutions & {{word 1 of p as number, word 2 of p as number}} 
end repeat 
# `resolutions` now contains a list of size lists; 
# e.g., with 2 displays, something like {{2560, 1440}, {1920, 1200}} 
+0

Das ist toll, kannst du dir einen Weg überlegen oder wissen, welches der aktive Desktop ist? Ich dachte über die Suche nach einer Möglichkeit zu wissen, in welchem ​​Desktop ist das aktive Fenster sitzen – perrohunter

+1

@perrohunter Ich würde nicht wissen, wie das generisch in AppleScript allein zu tun. Während Sie die Grenzen des aktiven Fensters der vordersten Anwendung wie folgt erreichen können: Grenzen des ersten Anwendungsfensters (Pfad zur vordersten Anwendung als Text), werden diese Grenzen in Form eines virtuellen Rechtecks ​​dargestellt, das _all_ anzeigt, wie von 'gemeldet Grenzen des Desktop-Fensters im Finder-Kontext. Ohne zu wissen, wie Ihre Anzeigen _angeordnet_ sind (vertikal, horizontal, nach links, nach rechts, ...), können Sie nicht auf die spezifische Anzeige schließen. – mklement0

5

Aus Gründen der noch Vollständigkeit, hier ist der Code die Breite, Höhe und Retina Skala einer spezifischen Display (Haupt- oder eingebaut) zu erhalten.

Dies ist der Code die Auflösung und die Retina Skala der eingebauten Display zu bekommen:

set {width, height, scale} to words of (do shell script "system_profiler SPDisplaysDataType | awk '/Built-In: Yes/{found=1} /Resolution/{width=$2; height=$4} /Retina/{scale=($2 == \"Yes\" ? 2 : 1)} /^ {8}[^ ]+/{if(found) {exit}; scale=1} END{printf \"%d %d %d\\n\", width, height, scale}'") 

Und dies ist der Code, um die Auflösung und Retina Skala der Hauptanzeige zu erhalten:

set {width, height, scale} to words of (do shell script "system_profiler SPDisplaysDataType | awk '/Main Display: Yes/{found=1} /Resolution/{width=$2; height=$4} /Retina/{scale=($2 == \"Yes\" ? 2 : 1)} /^ {8}[^ ]+/{if(found) {exit}; scale=1} END{printf \"%d %d %d\\n\", width, height, scale}'") 

Der Code basiert auf this post von Jessi Baughman und den anderen hier gegebenen Antworten.

-1

Auf meinem Rechner dauert system_profiler fast eine Sekunde, um eine Antwort zurückzugeben. Für meine Zwecke, so lange.

Pre-10.12, habe ich ASObjC Runner verwendet, aber anscheinend funktioniert das nicht mehr.

Das ist viel schneller für mich:

tell application "Finder" to get bounds of window of desktop

(Entnommen https://superuser.com/a/735330/64606)

0

die Breite, Höhe und Skalierung Um (Retina = 2, sonst = 1) für alle Monitore:

set resolutions to {} 
repeat with p in paragraphs of ¬ 
    (do shell script "system_profiler SPDisplaysDataType | awk '/Resolution:/{ printf \"%s %s %s\\n\", $2, $4, ($5 == \"Retina\" ? 2 : 1) }'") 
    set resolutions to resolutions & {{word 1 of p as number, word 2 of p as number, word 3 of p as number}} 
end repeat 

get resolutions 

auf answersabove Basierend.

Ergebnisse in etwa so: obwohl

{{2304, 1440, 2}, {1920, 1080, 1}} 
Verwandte Themen