2009-12-08 4 views
5

Я пытаюсь получить текущее разрешение экрана обоих моих дисплеев в зависимости от того, где находится указатель мыши.AppleScript как получить текущее разрешение дисплея?

Т.е. когда курсор мыши находится на первом дисплее, я хочу получить разрешение этого дисплея.

С скриптом я могу получить оба решения:

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

Но я не понимаю, какой дисплей в настоящее время «активный».

Любые идеи?

ответ

8

Applescript не имеет никакого доступа к местоположению курсора, даже через системные события. Сожалею.

[Есть пара коммерческих решений, но я предполагаю, что они не стоят проблем в этом случае? Я полагаю, я мог бы также взломать быстрый инструмент командной строки, который просто возвращает текущее местоположение курсора ... стоит того? »

p.s. AWK велика при поиске соответствующих строк:

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

Для полноты картины, вот код, чтобы захватить высоту экрана:

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

Это делает трюк:

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

Это работает только с одним дисплеем, хотя. – user495470

+0

С несколькими дисплеями 'bounds of the window of desktop' сообщает о едином, комбинированном * размере, который является * охватывающим прямоугольником вокруг всех дисплеев *, на основе их пространственного расположения, как определено в Системных настройках. Другими словами: вы не можете сказать, сколько показов есть, и сообщаемый прямоугольник может содержать области, которые на самом деле не отображаются. Аналогично, объекты Standard Window 'window' (окна приложений AppleScriptable через' bounds') и объекты 'Window' объекта Process (контекст' 'System Events '', через 'position') сообщают о своих координатах в терминах этого комбинированный прямоугольник. – mklement0

3

Следующая проблема не решает проблему OP, но может быть полезна тем, кто хочет определить разрешение всех подключенных дисплеев в AppleScript (спасибо @JoelReid и @ iloveitaly для строительных блоков):

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

Это здорово, вы можете подумать о способе или узнать, что является активным рабочим столом? Я думал искать способ узнать, в каком рабочем столе находится активное окно, сидящее – perrohunter

+1

@perrohunter Я бы не знал, как это сделать в общем в AppleScript. Хотя вы можете получить границы активного окна переднего приложения следующим образом: «границы первого окна приложения (путь к самому внешнему приложению в виде текста)», эти границы сообщаются в терминах виртуального прямоугольника, охватывающего _all_ дисплеев, как сообщается ' границы окна рабочего стола' в контексте «Finder». Не зная, как ваши дисплеи _arranged_ (вертикально, горизонтально, влево, вправо, ...), вы не сможете сделать вывод о конкретном дисплее. – mklement0

5

Ради еще большей полноты, вот код, чтобы получить ширину, высоту и Retina масштаб конкретного дисплея (основной или встроенный).

Это код, чтобы получить разрешение и Retina масштаб встроенного дисплея:

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}'") 

И это код, чтобы получить разрешение и Retina масштаб основного дисплея в :

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}'") 

код основан на this post по Jessi Боман и других ответов здесь.

-1

На моей машине system_profiler занимает почти секунду, чтобы ответить. Для моих целей это слишком долго.

Pre-10.12, я использовал ASObjC Runner, но, видимо, это уже не работает.

Это намного быстрее, для меня:

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

(Взято из https://superuser.com/a/735330/64606)

0

Чтобы получить ширину, высоту и масштабирования (сетчатку = 2, остальное = 1) для всех мониторов:

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 

на основе answersabove.

Результаты в чем-то вроде этого:

{{2304, 1440, 2}, {1920, 1080, 1}} 
Смежные вопросы