Расположение окна с помощью AppleScript с использованием двух мониторов - PullRequest
6 голосов
/ 03 мая 2011

У меня установлено два монитора, и я пытаюсь расположить окно приложения на втором мониторе, но ничего, что я делаю, похоже, не работает.Например, я использую свой ноутбук, и окно терминала развернуто на экране.Затем я подключаю внешний монитор.Затем я хочу запустить яблочный скрипт и развернуть терминал на большом втором мониторе.

Вот что у меня сейчас:

set monitorTwoPos to {1050, -600}
set monitorTwoSze to {1200, 1920}

tell application "Microsoft Outlook"
    set position of window 1 to monitorTwoPos
    set size of window 1 to monitorTwoSze
end tell

Вот ошибка, которую я получаю:

/Users/vcutten/AppleScripts/SpacesWork.scpt:1291:1332: execution error: 
Microsoft Outlook got an error: Can’t make position of window 1 into type specifier. (-1700)

Я почти уверен, что просто использую заданное положение и установил размер совершенно неправильно :( Когда я использовал bounds, это вроде как работает ...

Бонус Вопрос: Как я могу зациклитьчерез открытые окна и получить их размер? Спасибо!

Ответы [ 3 ]

2 голосов
/ 03 мая 2011

Что вы пробовали?

Я думаю, что для решения этой проблемы вам нужно рассчитать размер экрана и координаты второго монитора.Например, ваш главный монитор начинается с позиции {0,0}.Таким образом, исходное положение второго монитора должно быть чем-то другим, и вам нужно это найти.К счастью, я написал инструмент, который даст вам как начальные координаты, так и размер экрана ваших мониторов.Если у вас есть размер и положение, тогда все просто.Системные события могут установить размер и положение окна, чтобы вы могли сделать что-то вроде этого ...

set monitorSize to {800, 600}
set monitorPosition to {-800, 0}

tell application "System Events"
    tell process "Terminal"
        set frontWindow to first window
        set position of frontWindow to monitorPosition
        set size of frontWindow to monitorSize
    end tell
end tell

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

Надеюсь, это поможет ...

1 голос
/ 26 июня 2013

Вот скрипт, который обрабатывает сохранение и восстановление размера и положения для нескольких конфигураций дисплея. У него могут быть проблемы с полноэкранными приложениями, но, похоже, он работает нормально.

-- allSettings is a list of records containing {width:? height:? apps:{{name:? pos:? size:?},...} 
-- for each display setup store the apps and their associated position and size
property allSettings : {}

-- create a variable for the current settings
set currentSettings to {}

display dialog "Restore or save window settings?" buttons {"Restore", "Save"} default button "Restore"
set dialogResult to result

tell application "Finder"

    -- use the desktop bounds to determine display config
    set desktopBounds to bounds of window of desktop
    set desktopWidth to item 3 of desktopBounds
    set desktopHeight to item 4 of desktopBounds
    set desktopResolution to desktopWidth & "x" & desktopHeight

    -- find the saved settings for the display config
    repeat with i from 1 to (count of allSettings)
        if (w of item i of allSettings is desktopWidth) and (h of item i of allSettings is desktopHeight) then
            set currentSettings to item i of allSettings
        end if
    end repeat

    if (count of currentSettings) is 0 then
        -- add the current display settings to the stored settings
        set currentSettings to {w:desktopWidth, h:desktopHeight, apps:{}}
        set end of allSettings to currentSettings
        --say "creating new config for " & desktopResolution
    else
        --say "found config for " & desktopResolution
    end if

end tell

tell application "System Events"

    if (button returned of dialogResult is "Save") then
        say "saving"
        repeat with p in every process
            if background only of p is false then
                tell application "System Events" to tell application process (name of p as string)

                    set appName to name of p

                    if (count of windows) > 0 then
                        set appSize to size of window 1
                        set appPosition to position of window 1
                    else
                        set appSize to 0
                        set appPosition to 0
                    end if

                    set appSettings to {}

                    repeat with i from 1 to (count of apps of currentSettings)
                        if name of item i of apps of currentSettings is name of p then
                            set appSettings to item i of apps of currentSettings
                        end if
                    end repeat

                    if (count of appSettings) is 0 then
                        set appSettings to {name:appName, position:appPosition, size:appSize}
                        set end of apps of currentSettings to appSettings
                    else
                        set position of appSettings to appPosition
                        set size of appSettings to appSize
                    end if

                end tell
            end if
        end repeat
    end if

    if (button returned of dialogResult is "Restore") then
        if (count of apps of currentSettings) is 0 then
            say "no window settings were found"
        else
            say "restoring"
        repeat with i from 1 to (count of apps of currentSettings)
            set appSettings to item i of apps of currentSettings
            set appName to (name of appSettings as string)
            try
                tell application "System Events" to tell application process appName
                    if (count of windows) > 0 then
                        set position of window 1 to position of appSettings
                        set size of window 1 to size of appSettings
                    end if
                end tell
            end try
        end repeat
        end if
    end if
end tell

https://gist.github.com/cmackay/5863257

0 голосов
/ 27 марта 2013

Используйте границы вместо позиции, это работает. Вы можете получить границы окна следующим образом:

tell application "Microsoft Outlook"
    get bounds of first window
end tell

Ответ на бонусный вопрос:

tell application "Microsoft Outlook"
    repeat with nextWindow in (get every window)
        get bounds of nextWindow
    end repeat
end tell

Если вы откроете вкладку Ответы в нижней части редактора Applescript, вы увидите все полученные результаты.

Надеюсь, это поможет.

...