Можно ли изменить разрешение экрана с помощью сочетания клавиш?

Я использую разные разрешения экрана в зависимости от того, чем я занимаюсь в течение дня.
Например, когда я пишу код, я предпочитаю иметь больше свободного места.
Можно ли связать сочетание клавиш для изменения масштабированного разрешения экрана?
(см. прикрепленный скриншот)введите описание изображения здесь

display_manager.py у меня работал. Я создал рабочий процесс с помощью Automator и назначил сочетание клавиш через «Системные настройки»> «Клавиатура»> «Сочетания клавиш». (Моя команда /path/to/display_manager.py res 1920 1080 60:)

Ответы (11)

Да, вы можете добиться этого без запуска дополнительных приложений. В моей системе я создал два разных сценария. Один скрипт для увеличения разрешения экрана и один для уменьшения разрешения экрана. В моей системе я просто включил оба сценария в качестве команд диктовки, но если вы создаете новую службу через Automator, вы можете назначить этим службам сочетания клавиш.

Во-первых, вот два сценария, с которых я начал.

Это для увеличения разрешения экрана: если мое разрешение экрана уже находится в положении по умолчанию

введите описание изображения здесь

tell application "System Preferences"
    reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
    click radio button "Scaled" of radio group 1 of tab group 1
    click radio button 4 of radio group 1 of group 1 of tab group 1
end tell
quit application "System Preferences"

Запуск этого скрипта приведет к следующему:

введите описание изображения здесь

Следующий скрипт предназначен для уменьшения разрешения экрана: если разрешение экрана не установлено по умолчанию

tell application "System Preferences"
    reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
    click radio button "Scaled" of radio group 1 of tab group 1
    click radio button 3 of radio group 1 of group 1 of tab group 1
end tell
quit application "System Preferences"

Убедившись, что оба скрипта работают правильно, я открыл Automator, создал новую службу для более высокого разрешения экрана и добавил соответствующий скрипт, как показано на следующем рисунке. Я сохранил этот файл как rez_higher.workflow.

введите описание изображения здесь

Отсюда я открыл системные настройки/клавиатуру/ярлыки/службы. Я нашел эту новую службу, которую я создал, и назначил ей сочетание клавиш

введите описание изображения здесь

После этого просто выполните те же процедуры, чтобы создать новый рабочий процесс и сервис для более низкого разрешения экрана.

Спасибо, это сработало, как я хотел. Я также нашел рабочий процесс, в котором вы можете переключать изменение разрешения в том же скрипте здесь.
Это потрясающе. Я следую большей части этого. Где можно найти такие подробности, как имя привязки «displayDisplayTab»? Я хотел бы разработать что-то похожее на установку (и отмену) цвета рабочего стола. Все / любые детали очень приветствуются.
Этот скрипт в примере вызывает ошибку: error "System Events got an error: Can’t get tab group 1 of window \"Built-in Retina Display\" of process \"System Preferences\". Invalid index.он сломан каким-либо обновлением OSX?
@JakubBoucek, см. мое исправление, опубликованное как новый ответ
ОГРОМНОЕ спасибо wch1zpink и @Zade! Это именно то, на что я надеялся! Я буду использовать это более 10 раз в день, потому что всякий раз, когда я делюсь экраном с коллегами, мне нужно использовать более низкое разрешение.
Мне нужно было delay 1, как показывает wch1zpink (в отличие от @Zade). Кроме того, я позже заметил в Catalina 10.15.7, что мои сочетания клавиш не будут работать в зависимости от того, какое приложение было сфокусировано, когда я их набирал. Мне нужно было предоставить разрешения в «Системных настройках»> «Безопасность и конфиденциальность»> «Автоматизация» (а также «Доступность»). Хотел бы я знать, как это обойти, потому что я не могу знать заранее все приложения, которые у меня могут быть открыты, когда я захочу использовать ярлык. Но это все еще супер полезно! Спасибо.

Я написал бесплатный инструмент командной строки displayplacer для изменения разрешения/поворота для рабочих столов с одним или несколькими мониторами. Вы можете активировать «профиль» (пример ниже) с помощью сочетания клавиш с помощью Automator, такого как объяснение wch1zpink, BetterTouchTool и т. Д.

displayplacer 'id:69731906 res:1440x900 scaling:on origin:(0,0) degree:0'

Исправление ответа wch1zpink на macOS 13.0.1 благодаря приложению UI Browser:

do shell script "open x-apple.systempreferences:com.apple.preference.displays"
tell application "System Events"
    tell application process "System Settings"
        repeat until (exists UI element 1 of group 1 of scroll area 2 of group 1 of group 2 of splitter group 1 of group 1 of window "Displays")
            delay 0.1
        end repeat
        tell window "Displays"
            set displayOptions to UI element 1 of group 1 of scroll area 2 of group 1 of group 2 of splitter group 1 of group 1
            set theButton to (first button of displayOptions whose value of attribute "AXAttributedDescription" contains "Selected")
            if help of theButton is "2560 × 1440" then
                click button 1 of displayOptions
            else
                click button 3 of displayOptions
            end if
        end tell
    end tell
end tell
quit application "System Settings"

Исправление в macOS 12.0.1:

tell application "System Preferences"
    reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events"
    tell application process "System Preferences"
        repeat until (exists radio button "Scaled" of radio group 1 of group 1 of window "Displays")
            delay 0.1
        end repeat
        tell window "Displays"
            set isScaled to value of radio button "Scaled" of radio group 1 of group 1
            if isScaled = 0 then
                click radio button "Scaled" of radio group 1 of group 1
                click button 1 of UI element 3 of group 1
            else
                click radio button "Default for display" of radio group 1 of group 1
            end if
        end tell
    end tell
end tell
quit application "System Preferences"

Исправление в macOS 10.15.4:

tell application "System Preferences"
    reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
    set isScaled to value of radio button "Scaled" of tab group 1
    if isScaled = 0 then
        click radio button "Scaled" of tab group 1
        click radio button 1 of radio group 1 of group 1 of tab group 1
    else
        click radio button "Default for display" of tab group 1
    end if
end tell
quit application "System Preferences"
У меня все еще та же ошибка. ошибка System Events got an error: Can’t get radio button \"Scaled\" of tab group 1 of window \"Built-in Retina Display\" of process \"System Preferences\"." number -1728 from radio button "Scaled" of tab group 1 of window "Built-in Retina Display" of process "System Preferences"С предыдущим кодом номер 1719. Просто изменил номер
@leon используйте приложение UI Browser, чтобы получить названия кнопок в вашей версии macOS.

Октябрь 2022 г. Решение для macOS 12.6

Добавление еще одного решения в список. Решение Имрона Гамидли приблизило меня к тому, что я хотел, с поведением переключателя.

Вот мой скрипт, который я добавил в качестве команды Raycast, чтобы я мог запускать raycast или назначать сочетание клавиш.

#!/usr/bin/osascript

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Toggle Resolution
# @raycast.mode silent

# Optional parameters:
# @raycast.icon 🤖

set monitor to 2
tell application "System Preferences"
    activate
    set the current pane to pane id "com.apple.preference.displays"
    delay 2
    tell application "System Events"
        tell window "Displays" of application process "System Preferences"
            click button "Display Settings…"
            delay 2
            click row monitor of outline 1 of scroll area 1 of sheet 1
            click radio button "Scaled" of radio group 1 of sheet 1
            try
                set selected_button to button "Resolution5, Selected" of UI element 6 of sheet 1
                click button "Resolution1" of UI element 6 of sheet 1
            on error
                click button "Resolution5" of UI element 6 of sheet 1
            end try
            delay 0.5
            click button "Done" of sheet 1
        end tell
    end tell
end tell
# The next line is optional and could be commented out by prepending with a hash (#).
delay 2
quit application "System Preferences"
Спасибо, что поделились этим, так как мой ответ apple.stackexchange.com/a/436069/53510 больше не работает. Я тоже не могу заставить ваш ответ работать. Синтаксическая ошибка: в системных событиях возникает ошибка: не удается получить кнопку «Разрешение5» элемента пользовательского интерфейса 6 листа 1 окна «Отображения» процесса приложения «Системные настройки».
@Ryan Какая у тебя версия ОС? Это работает для меня на 12.6 и единственной версии, на которой я это тестировал. Иногда я замечал некоторые проблемы, я думаю, когда машина находится под нагрузкой. Вы можете попробовать поиграть с задержками и посмотреть, поможет ли более длинная задержка.
Спасибо. Я на 12.6. Сегодня я вижу, что могу загрузить 13.0, так что, возможно, я попробую обновиться в течение недели или около того. Даже при более длительных задержках я все еще получаю сообщение об ошибке, о которой упоминал в своем предыдущем комментарии. Из любопытства, как вы узнали, как написать этот сценарий? Как узнать названия и номера каждой области/элемента на экране? Спасибо!!
@ Райан Хм, тогда не уверен. Он все еще работает на моей машине. Я предполагаю, что 13.0 сломает сценарий, поскольку был изменен дизайн Системных настроек, переименованный в Системные настройки и переработанный. Что касается того, как написать сценарий, я очень неопытен в яблочном сценарии. Я попробовал кучу вариантов здесь, много угадал, поискал на форуме автоматизаторов и обнаружил, что вы можете получить некоторые имена элементов с помощью инструмента «Инспектор специальных возможностей». Также есть некоторая поддержка точек останова и журналирования, которую вы можете использовать для распечатки элементов. Если у кого-то еще есть советы здесь, я также стремлюсь учиться.
Я еще не пробовал Инспектор доступности. Спасибо.
@Ryan, дай мне знать, как дела. Я рад внести изменения в свой ответ и также могу опубликовать это на GH, если это будет полезно.
Хорошо, я установил Xcode и перешел в Xcode > Open Developer Tool > Accessibility Inspector. Кажется, что это будет полезно, но не супер просто. Я прочитаю на сайте developer.apple.com/library/archive/documentation/Accessibility/… и посмотрю, что смогу выяснить.
Я до сих пор не мог понять это. Я обновлю свой вопрос apple.stackexchange.com/q/449891/53510 скриншотом.

Что работает для меня в 2022 году на macOS 12.1 на MacBook Pro

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

  1. Automator> Файл> Создать> Быстрое действие > Выбрать
  2. Найдите «Запустить AppleScript» и дважды щелкните результат.
  3. Замените код сценария по умолчанию тем, что я привожу ниже.
  4. Попробуйте пару раз нажать кнопку «Выполнить», чтобы проверить, работает ли переключение.
  5. Сохранить как «toggle_display_resolution». (Позже, если вы когда-нибудь захотите отредактировать его, вы откроете его /Users/your_username/Library/Services/toggle_display_resolution.workflowв Automator).
  6. Закрыть автомат.
  7. Системные настройки> Клавиатура> Ярлыки> Службы
  8. Назначьте сочетание клавиш новой службе, которую вы создали (которая, вероятно, будет внизу списка).

Кстати, вам может понадобиться отредактировать «Безопасность и конфиденциальность»> «Доступность». Смотрите ответ .

on run {input, parameters}
    
    # https://apple.stackexchange.com/a/436069/53510
    tell application "System Preferences"
        reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
    end tell
    tell application "System Events"
        tell application process "System Preferences"
            repeat until (exists radio button "Scaled" of radio group 1 of group 1 of window "Displays")
                delay 0.1
            end repeat
            tell window "Displays"
                set isScaled to value of radio button "Scaled" of radio group 1 of group 1
                if isScaled = 0 then
                    click radio button "Scaled" of radio group 1 of group 1
                    # button '5' means highest resolution (smalled font):
                    click button 5 of UI element 3 of group 1
                else
                    click radio button "Default for display" of radio group 1 of group 1
                end if
            end tell
        end tell
    end tell
    # The next line is optional and could be commented out by prepending with a hash (#).
    quit application "System Preferences"
    
    return input
end run

PS Большое спасибо wch1zpink и Zade , ответы которых привели к моим. Голосуйте за них тоже.

PPS Мне любопытно узнать, могу ли я более легко поделиться этим быстрым действием / сервисом.

Смотрите новый вопрос: apple.stackexchange.com/questions/449891/…

Начиная с macOS 12.2.1 с введением ярлыков вам больше не нужно сочетание клавиш. В любом случае, большое спасибо Райану , который лег в основу моего кода. Вот оно:

    on run {input, parameters}
        
        # https://apple.stackexchange.com/a/436069/53510
        tell application "System Preferences"
            activate
            reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
            delay 2 #Make longer if needed
            tell application "System Events"
                tell application process "System Preferences"
                    tell window 1
                        click button 1 #Monitor settings
                        delay 0.7 #Make longer if needed
                        select row 2 of outline 1 of scroll area 1 of sheet 1 #Row=monitor number
                        click radio button 2 of radio group 1 of sheet 1 #Select "Scaled"
                        click button 2 of UI element 6 of sheet 1 #Select resolution
                        click button 2 of sheet 1 #Done
                        click button 4 #Close System Preferences
                    end tell
                end tell
            end tell
        end tell
        return input
    end run

Задержки нужны из-за времени открытия окна, иначе индексация срывается. Если он все еще ломается, просто продлите задержки. Для номера строки, если вы хотите повлиять, например, на 3-й монитор, вместо этого напишите «строка 3». Если вы делаете вторую, чтобы увеличить разрешение, и уже выбран масштаб, вы можете избавиться от этой линии.

РЕДАКТИРОВАТЬ: для MacOS 12.3 измените кнопку 4 на кнопку 5

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

set res to 3
set monitor to 2
tell application "System Preferences"
    activate
    set the current pane to pane id "com.apple.preference.displays"
    delay 2
    tell application "System Events"
        tell window "Displays" of application process "System Preferences"
            click button "Display Settings…"
            delay 2
            click row monitor of outline 1 of scroll area 1 of sheet 1
            click radio button "Scaled" of radio group 1 of sheet 1
            click button res of UI element 6 of sheet 1
        end tell
    end tell
end tell
Спасибо, что поделились этим, так как мой ответ apple.stackexchange.com/a/436069/53510 больше не работает. Я тоже не могу заставить ваш ответ работать. Синтаксическая ошибка: системные события идут с ошибкой: не удается получить кнопку 3 элемента пользовательского интерфейса 6 листа 1 окна «Дисплеи» процесса приложения «Системные настройки». Неверный индекс.

Вы можете использовать это приложение под названием SwitcherResX ( http://www.madrau.com/srx_download/download.html ), где у них есть возможность изменить разрешение с помощью сочетания клавиш или в зависимости от используемого вами приложения. У них есть испытание, чтобы попробовать.введите описание изображения здесь

Спасибо. Я искал что-то на системном уровне без запуска дополнительных приложений. Но я приму ваше предложение к рассмотрению как альтернативное решение!

За меня это сделало приложение EasyRes (бесплатно в магазине приложений Apple). Я потратил час на сброс NVRAM, отчаянно пытаясь вернуть своему 30-дюймовому дисплею Apple Cinema 2006 года выпуска обратно к полному разрешению, но безрезультатно. Я перезагружался, должно быть, 25 раз. EasyRes позаботился об этом. Спасибо, EasyRes, я был сходить с ума!

Обновление: это не «прилипает» - когда я перезагружаюсь, я возвращаюсь к 1280x800, и мне снова приходится использовать EasyRes, но я перезагружаюсь только раз в пару месяцев, так что это работает.

У кого-нибудь есть AppleScript для Ventura? Пытался использовать Keyboard Maestro и почему-то не смог этого добиться. Есть несколько приложений, в которых нет возможности изменять размер шрифта, и мне бы хотелось, чтобы это было быстро, и я быстро вернул его к значениям по умолчанию.

Это на самом деле не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав Задать вопрос . Чтобы получать уведомления о новых ответах на этот вопрос, вы можете подписаться на этот вопрос . Как только у вас будет достаточно репутации , вы также можете добавить награду , чтобы привлечь больше внимания к этому вопросу. - Из обзора

Обратите внимание, что ответ @ wch1zpink отлично работает, но Big Sur вносит в него некоторые критические изменения и требует пересмотра. Это сработало для меня с внешним дисплеем, поэтому просто замените LG ULTRAWIDE на заголовок в окне.

сжать-экран

on run {input, parameters}
    
    activate application "System Preferences"
    tell application "System Events"
        tell process "System Preferences"
            click button "Displays" of scroll area 1 of window "System Preferences"
            delay 0.5
            
            tell tab group 1 of window "LG ULTRAWIDE"
                click radio button "Scaled"
                delay 0.5
                select row 4 of table 1 of scroll area 1
            end tell
        end tell
        delay 1
        quit application "System Preferences"
    end tell
    
    return input
end run

расширить экран

on run {input, parameters}
    
    activate application "System Preferences"
    tell application "System Events"
        tell process "System Preferences"
            click button "Displays" of scroll area 1 of window "System Preferences"
            delay 0.5
            
            tell tab group 1 of window "LG ULTRAWIDE"
                click radio button "Default for Display"
            end tell
        end tell
        delay 0.5
        quit application "System Preferences"
    end tell
    
    return input
end run
Пожалуйста, объясните, почему и как это работает