Мало того, что это не зарегистрировано, но поведение совершенно византийское.Следующее относится к Горному льву (по состоянию на 10.8.1), но я подозреваю, что оно в равной степени относится к Льву.
Коротко:
Выможет только проверить состояние полноэкранного окна, если оно является активным окном самого переднего приложения.Таким образом, вы должны сначала активировать любое окно, которое вы хотите просмотреть.
Если это окно действительно в настоящее время находится в полноэкранном режиме, но не является активным, активация займет некоторое время -длительность анимации перехода - только после , когда окно доступно программно.
Пока вас интересует только активное (переднее) окно активного (самого переднего) приложения,все денди;в противном случае вам будет больно.
Ниже приведены сценарии, выполняющие следующее:
- Укажите, находится ли активное окно в активном (переднем) приложении в полноэкранном режиме.
- Переключить полноэкранный статус активного окна в активном приложении.
- Укажите, есть ли у указанного приложения полноэкранные окна.
- Универсальный сценарий полноэкранного управления, который может быть нацелен науточняемое заявление;это намного сложнее, чем должно быть.
Наконец, в конце есть дополнительная справочная информация - очень весело.
Обратите внимание, что для скриптов ниже требуется доступ для вспомогательных устройств должен быть включен через System Preferences
> Accessibility
или с помощью следующей команды: tell application "System Events" to set UI elements enabled to true
;требуются права администратора.
Указывает, находится ли активное окно в активном (переднем) приложении в полноэкранном режиме
(*
Indicates if the active window of the active application is currently in fullscreen mode.
Fails silently in case of error and returns false.
*)
on isFullScreen()
tell application "System Events"
try
tell front window of (first process whose frontmost is true)
return get value of attribute "AXFullScreen"
end tell
end try
end tell
return false
end isFullScreen
Переключение полноэкранного состояния активного окна в активном приложении
(*
Toggles fullscreen status of the active window of the active application.
Return value indicates if the window is in fullscreen mode *after* toggling.
Fails silently in case of error, e.g., if the active application doesn't support fullscreen mode, and returns false.
*)
on toggleFullScreen()
set isFullScreenAfter to false
tell application "System Events"
try
tell front window of (first process whose frontmost is true)
set isFullScreen to get value of attribute "AXFullScreen"
set isFullScreenAfter to not isFullScreen
set value of attribute "AXFullScreen" to isFullScreenAfter
end tell
end try
end tell
return isFullScreenAfter
end toggleFullScreen
Указывает, имеет ли указанное приложение полноэкранные окна
** Примечание: эта подпрограмма будет работать только с приложениями с поддержкой AppleScript. **
(*
Determine if the specified, *AppleScript-enabled* application currently has windows in fullscreen mode or not.
Note: Assumes that the application name is the same as the process name.
*)
on hasFullScreenWindows(appName)
-- We compare the count of visible application windows to the count of the application *process'* windows.
-- Since process windows either do not include the fullscreen windows or, if a fullscreen window
-- is active, only report that one window, a discrepancy tells us that there must be at least one fullscreen window.
set countAllWindows to count (windows of application appName whose visible is true)
tell application "System Events" to set countProcessWindows to count windows of process appName
if countAllWindows is not countProcessWindows then
set hasAny to true
else
set hasAny to false
-- The app-window count equals the process-window count.
-- We must investigate one additional case: the app may be currently frontmost and could have
-- a single window that is in fullscreen mode.
tell application "System Events"
set activeProcName to name of first process whose frontmost is true
if activeProcName is appName then
tell process appName
tell front window
set hasAny to get value of attribute "AXFullScreen"
end tell
end tell
end if
end tell
end if
return hasAny
end hasFullScreenWindows
общего назначениясценарий полноэкранного управления, который может быть нацелен на указанное приложение
** Примечание. Эта подпрограмма будет работать только с приложениями с поддержкой AppleScript. **
(*
Sets the fullscreen status for either the front window or all windows of the specified, *AppleScript-enabled* application.
The 2nd parameter can take the following values:
0 … turn fullscreen OFF
1 … turn fullscreen ON
2 … toggle fullscreen
The 3rd parameter is used to specify whether *all* windows should be targeted.
Example:
my setFullScreen("Safari", 2, false) toggles fullscreen status of Safari's front window.
NOTE:
- ONLY works with AppleScript-enabled applications.
- The targeted application is also activated (also required for technical reasons).
- If you target *all* windows of an application, this subroutine will activate them one by one, which
is required for technical reasons, unfortunately.
This means: Whenever you target *all* windows, expect a lot of visual activity, even when
the fullscreen status needs no changing; activity is prolonged when fullscreen transitions
are involved.
- If the target application has a mix of fullscreen and non-fullscreen windows and the application
is not currently frontmost, the OS considers the first *non*-fullscreen window to
be the front one, even if a fullscreen window was active when the application was
last frontmost.
*)
on setFullScreen(appName, zeroForOffOneForOnTwoForToggle, allWindows)
# Get window list and count.
tell application appName
set wapp_list to windows whose visible is true
set wcount to count of wapp_list
## set wapp_names to name of windows whose visible is true
## log wapp_names
end tell
set MAX_TRIES to 20 # Max. number of attempts to obtain the relevant process window.
set toggle to zeroForOffOneForOnTwoForToggle is 2
set turnOn to false
if not toggle then set turnOn to zeroForOffOneForOnTwoForToggle is 1
if allWindows and wcount > 1 then -- Target *all* the application's windows.
tell application "System Events"
tell process appName
set indexOfTrueFrontWin to -1
set wproc_target to missing value
set wproc_targetName to missing value
-- Loop over application windows:
-- Note that we have 2 extra iterations:
-- Index 0 to determine the index of the true front window, and count + 1 to process the true front window last.
repeat with i from 0 to wcount + 1
## log "iteration " & i
if i ≠ 0 and i = indexOfTrueFrontWin then
## log "ignoring true front win for now: " & i
else
set ok to false
if i ≠ 0 then
set wapp_index to i
if i = wcount + 1 then set wapp_index to indexOfTrueFrontWin
set wapp_target to get item wapp_index of wapp_list
set wapp_targetName to get name of wapp_target -- Note: We get the name up front, as accessing the property below sometimes fails.
end if
repeat with attempt from 1 to MAX_TRIES
## log "looking for #" & i & ": [" & wapp_targetName & "] (" & id of wapp_target & ")"
# NOTE: We MUST activate the application and the specific window in case that window is in fullscreen mode.
# Bizzarrely, without activating both, we would not gain access to that active window's *process* window,
# which we need to examine and change fullscreen status.
if i ≠ 0 then
## log "making front window: " & wapp_targetName
set index of wapp_target to 1 -- Make the window the front (active) one; we try this *repeatedly*, as it can get ignored if a switch from a previous window hasn't completed yet.
end if
set frontmost to true -- Activate the application; we also do this repeatedly in the interest of robustness.
delay 0.2 -- Note: Only when the window at hand is currently in fullscreen mode are several iterations needed - presumably, because switching to that window's space takes time.
try
-- Obtain the same window as a *process* window.
-- Note: This can fail before switching to a fullscreen window is complete.
set wproc_current to front window
-- See if the desired process window is now active.
-- Note that at this point a previous, fullscreen window may still be reported as the active one, so we must
-- test whether the process window just obtained it is the desired one.
-- We test by *name* (window title), as that is the only property that the *application*
-- window class and the *process* window class (directly) share; sadly, only application windows
-- have an 'id' property.
-- (There is potential for making this more robust, though, by also comparing window sizes.)
if i = 0 then
-- We determine the index of the *actual* front window, so we can process it *last*
-- so we return to the same window that was originally active; with fullscreen windows
-- involved, sadly, `front window` is NOT always the true front window.
set indexOfTrueFrontWin to 1
repeat with ndx from 1 to wcount
if name of (item ndx of wapp_list) is name of wproc_current then
set indexOfTrueFrontWin to ndx
exit repeat
end if
end repeat
## log "true front index: " & indexOfTrueFrontWin
set ok to true
exit repeat
else
if (name of wproc_current) is wapp_targetName then
## log "processing: [" & name of wproc_current & "]"
tell wproc_current
set isFullScreen to get value of attribute "AXFullScreen"
if toggle then set turnOn to not isFullScreen
if isFullScreen is not turnOn then
## log "setting fullscreen to: " & turnOn
set value of attribute "AXFullScreen" to turnOn
delay 0.3 -- For good measure; it seems turning fullscreen *on* sometimes fails (you'll hear a pop sound).
else
## log "no change needed"
end if
end tell
set ok to true
exit repeat
else
## log "no match; waiting for '" & wapp_targetName & "', actual: '" & name of wproc_current & "'"
end if
end if
end try
end repeat
if not ok then error "Obtaining process window '" & wapp_targetName & "' of application " & appName & " timed out."
end if
end repeat
end tell
end tell
else if wcount > 0 then -- Target *current* window only (if there is one).
tell application "System Events"
tell process appName
# NOTE: We MUST activate the application in case its active window is in fullscreen mode.
# Bizzarrely, without activating, we would not gain access to that active window's *process* window.
set frontmost to true
set ok to false
repeat with attempt from 1 to MAX_TRIES
delay 0.2 -- Note: Only when the active window is currently in fullscreen mode are several iterations needed - presumably, because switching to that window's space takes time.
try
-- Obtain the same window as a *process* window, as only a process window allows us to examine or
-- change fullscreen status.
tell front window -- Note: This can fail before switching to a fullscreen space is complete.
set isFullScreen to get value of attribute "AXFullScreen"
if toggle then set turnOn to not isFullScreen
if isFullScreen is not turnOn then
set value of attribute "AXFullScreen" to turnOn
end if
end tell
set ok to true
exit repeat
end try
end repeat
if not ok then error "Obtaining active process window of application" & appName & " timed out."
end tell
end tell
end if
end setFullScreen
Дополнительная справочная информация:
Коллекция окон приложения *1060* - доступная в контексте блока tell application ...
- всегда сообщает общее количество окон, независимо от того, находятся они в полноэкранном режиме или нет.К сожалению, такие объекты окна НЕ МОГУТ использоваться для определения или установки полноэкранного режима - это должно быть сделано через объекты окна, о которых сообщают объекты process в контексте приложения «Системные события», поскольку только они содержат соответствующиеАтрибут «AXFullScreen». Важно отметить, что коллекция окон приложения - в отличие от коллекции окон процесса - работает только с приложениями, поддерживающими AppleScript .
К сожалению, коллекция окон открыта обрабатывает объекты в контексте приложения «Системные события» ведут себя странно:
○ Когда приложение не является передним или активно одно из его не полноэкранных окон, оно содержит толькоNON-полноэкранные окна
○ Напротив, когда приложение является передним и одно из его полноэкранных окон активно, оно только когда-либо содержит , что одно полноэкранное окно , даже если другие окна (независимо отсуществуют ли они в полноэкранном режиме или нет).
○ Сопоставить окна приложений и процессов довольно сложно, поскольку только окна приложений имеют свойство 'id';единственное свойство, которое разделяют два типа напрямую, это «имя» (т. е. заголовок окна);оба типа также содержат информацию о размере, но не в одном и том же формате.
○ (Кроме того, окна процессов никогда не содержат скрытых окон, тогда как коллекция окон приложения должна быть отфильтрована с помощью whose visible is true
, чтобы исключить скрытые окна.)
В результате, если вы хотите обработать все окон данного приложения, базовый подход выглядит следующим образом:
○ Активируйте приложение.
○ Циклповерх всех (видимых) приложений объектов окон.
○ Сделайте каждое окно передним.
○ Подождите, пока соответствующее окно process не станетпрограммно доступный;это займет довольно много времени, если активация окна включает полноэкранный переход.
○ Проверьте или измените полноэкранное состояние окна процесса (value of attribute "AXFullScreen"
).
Если приложение имеет только полноэкранные окна, AppleScript может запутаться из-за того, что такое переднее окно: что оно сообщает, поскольку переднее окно может быть не тем, которое активно при активации приложения с помощью AppleScript илиCmd-tab к нему.
При использовании activate
для активации приложения будет активировано не полноэкранное окно целевого приложения, если оно есть, даже если оно полноэкранное.окно этого приложения ранее было активным.Однако вы можете установить полноэкранное окно index of
на 1, чтобы активировать его.