Як ви можете знайти, який монітор має панель меню в AppleScript?


2

Граючи з AppleScript, я хочу маніпулювати розташуванням декількох вікон position але у мене виникає проблема визначення монітора. В даний час у мене є кілька різних розмірів і брендів монітори я підключення до мого MacBook під час моїх подорожей. Єдиним повторенням з усіма чотирма моніторами, з якими я підключаюся, є те, що монітор, яким я хочу маніпулювати, включає панель меню.

При тестуванні з do shell script "system_profiler SPDisplaysDataType Я не впевнений, що повернутий текст Main Display: Yes вважає основним, де знаходиться рядок меню від вилучення:

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

Якщо моє припущення Main Display правильно, як я повинен правильно grep дозвіл ідентифікованого основного дисплея, щоб я міг маніпулювати вікнами?

Коли я займаюся дослідженнями, це показуватиметься, як правило, на кожному дисплеї:

Тому я не знаю, чи це буде два питання в одному. Я дещо заплутався про те, як послідовність визначається при підключенні до декількох моніторів (наприклад, сьогодні я можу бути підключений до дисплея, але завтра я можу бути підключений до двох моніторів Dells через мої два DisplayPorts), і якщо є спосіб націлювання на монітор, зокрема на основі рядка меню.

Я вже можу виявити додаток і його розмір:

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

але моя проблема припадає на визначення резолюції, тому я можу обчислити position і bounds , щоб перемістити вікно програми.

Відповіді:


2

UPDATE

Вилучено мою оригінальну відповідь. Ось зовсім інший підхід, який я віддаю перевагу над оригінальним рішенням. Ця версія фактично використовує додавання сценаріїв "Зображення подій".

Цей сценарій отримає назви дисплеїв, підключених до комп'ютера. Повернені значення "display" Display 1 "завжди будуть", який монітор має панель меню в 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

enter image description here enter image description here enter image description here enter image description here enter image description here


2

У моєму тестуванні ви правильно, що основним дисплеєм є той, що має меню, призначене в меню Відображення системи Prefs. Я перевірив, перемістивши рядок меню з одного дисплея на інший і запустивши ваш сценарій. Результати показують, що, де б не було меню, на дисплеї буде відображатися "Main Display: Yes".

Щоб розібрати роздільну здатність, я б використав аргумент -xml для команди system_profiler, щоб отримати послідовний текст для пошуку, а потім використовуйте розділювачі текстових елементів Apple для аналізу даних. Я написав цей сценарій, і коли я перемикаю меню вперед і назад, він повертає дозвіл поточного основного дисплея. Можливо, вам доведеться налаштувати роздільники в залежності від того, яку операційну систему повертає звіт про системний профайлер.

Я додав коментарі в коді нижче, щоб пояснити, що робить сценарій.

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

EDIT: Оскільки ви надсилали звичайну форму system_profiler вище, я повторно написав скрипт для аналізу цього виводу. Мені здається трохи більш ризикованим, ніж використання xml, але він повинен компілюватися і працювати правильно на вашій системі без будь-яких налаштувань.

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

Якщо я скопіюю і вставлю ваш код у редактор сценаріїв, тоді він компілює, тим не менш, помилки. Я повинен змінити щось у коді ви відправили по пошті зробити це робота, якщо так що?
user3439894

Ви, ймовірно, повинні перевірити xml-звіт, який він повертає, щоб переконатися, що речі, які я встановив до розділювачів текстових елементів, однакові для вашої системи. Ви можете додати рядок коду "return pfl" відразу після першого рядка коду, щоб побачити, що ваша система повертається. Якщо, наприклад, "& lt; / data & gt; & lt; key & gt; _name & lt; / key & gt;" у вашому звіті не існує (не враховуючи пробіл), вам доведеться змінити його на все, що відбувається перед іменем дисплея. Якщо "& lt; ключ & gt; _spdisplays_resolution & lt; / key & gt; & lt; string & gt;" не існує, змінити його відповідно. Я керую Sierra 10.12.6, можливо, у вас є версія dif з звітом dif.
Hurston

Якщо ви хочете розмістити xml тут (що pfl в цьому сценарії), я шукаю роздільники і переглядаю сценарій, щоб відобразити це.
Hurston

Ваше оновлення як кодованого повертається з провідним простором, напр. " 2560 x 1440" але якщо ви додасте пробіл після Resolution, напр. set text item delimiters to "Resolution: " його видаляють, наприклад "2560 x 1440"
user3439894

додав простір.
Hurston

2

Перевірено на моєму MacBook Pro з Дисплей Thunderbolt додається Панель меню на ньому працювали:

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:"

Якщо я переключу Панель меню до MacBook Pro , вона повертає ім'я з Дисплей його, а не ім'я з Дисплей Thunderbolt .

Для Роздільна здатність мого Дисплей Thunderbolt :

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"

Якщо я переключу Панель меню до MacBook Pro , вона повертає дозвіл з Дисплей його, а не дозвіл з Дисплей Thunderbolt .


Також перегляньте мої відповіді на, Сценарій для переміщення панелі меню з двома моніторами і Змінити відображення в OS X програмно для декількох утиліт сторонніх виробників вам також може знадобитися.

Примітка: Я не маю жодної приналежності до розробників утиліт, згаданих і використаних у моїх відповідях на посиланнях вище.


Розуміння трохи про команд оболонки використовується в do shell script команд :

Командна частина do shell script команду :

system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'
  • system_profiler - Конфігурація апаратного та програмного забезпечення системи звітів.
    • SPDisplaysDataType - генерує текстовий звіт, що містить лише графіку та дисплеї.
  • | Труба пряма вихід провадження команду до введення наступного команду .
  • grep - Пошук файлів. The grep Утиліта шукає будь-які вхідні файли, вибираючи рядки, які відповідають одному або більше шаблонів.
    • −B num - Друк num рядки провідного контексту перед кожним матчем.
    • 'Main Display:' Шаблон для відповідності.
  • | Труба пряма вихід провадження команду до введення наступного команду .
  • awk - Шаблонно-спрямоване сканування і мова обробки.
    • sub(/^[ \t]+/, \"\") - Заміна функції рядка - sub(regexp, replacement) - Використовується в цьому випадку для видалення провідного пробілу.
      • ^ - Стверджує позицію на початку рядка.
      • [ \t] - Знайдіть один символ у списку.
        • space - Відповідає space буквально. Зверніть увагу на це space тут використовується для позначення одного символу пробілу (ASCII 32).
        • \t - Відповідає символу табуляції (ASCII 9).
      • + - Матчі між одним і необмеженим часом, стільки разів, скільки можливо, віддаючи у міру необхідності (жадібні).
      • \"\" - Заміна ні з чим ( "" ). The "" втікають, \, тому команду можна компілювати і передавати оболонці. Якщо вводиться безпосередньо в командному рядку "" не потрібно було втекти.
    • print $0 - Друкує повний запис. - У цьому випадку друкується п'ята лінія вище Main Display:, san провідний пробіл.
    • exit - Вихід після першого друку запис .

Командна частина do shell script команду :

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

У цьому do shell script команду awk '/Resolution:/{print $2,$3,$4}' частина виконує наступне:

The вихід напр .:

$ 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
$

Отримує трубопровід до awk і він шукає введення для запис містить Resolution: що знаходить наступне запис відповідність:

          Resolution: 2560 x 1440

The print $2,$3,$4 команду , Друкує друге, третє і четверте поля з запис . The , кома між $n поля означає вставити a простір . The вихід з яких:

2560 x 1440

Є grep -B 3 для трьох ліній до і що це підстрока awk? Плюс один для прориву grep awk та друк це допоможе іншим, також.
ʀ2ᴅ2

@ DᴀʀᴛʜVᴀᴅᴇʀ, так, grep -B 3 має включати три рядки перед матч і я зняв замість функції від awk для команди Resolution: тому що там дійсно не було потрібно. Я головував протягом нечисленних годин та дам прорив вниз трохи пізніше. Тим не менш, я б особисто, можливо, використовувати cscreen і розібрати інформацію з неї system_profiler і я додаду приклад, якщо ви не проти використання сторонніх утиліт.
user3439894

Я б особисто вважав за краще використовувати вбудовані, але інші можуть виявитися цікавими з тим, що треті сторони можуть зробити.
ʀ2ᴅ2

@ DᴀʀᴛʜVᴀᴅᴇʀ, я оновив відповідь, щоб трохи пояснити, що таке команд оболонки з do shell script команд роблять.
user3439894
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.