Вывести окно процесса на передний план?

Это должен быть достаточно простой вопрос, чтобы ответить (я предполагаю).

Скажем, я хочу активировать окно 1 процесса «ScreenFlow», как мне это сделать?

Я знаю, что Application('ScreenFlow').activate() выводит Processes['ScreenFlow').windows[0] на передний план. Но как тогда переключиться на Processes['ScreenFlow').windows[n]?

Спасибо


person Sancarn    schedule 13.01.2017    source источник
comment
Вы хотите всегда выводить это окно на передний план, даже если фокус пользователя находится в другом приложении? (Я не уверен, позволяет ли это macOS — прерывать пользователя — плохая идея, и лично у меня это было, когда приложения крадут фокус).   -  person Dai    schedule 13.01.2017
comment
Обратите внимание, что есть разница между выводом на передний план (например, отображение окна всегда поверх) и кражей фокуса — что, как я полагаю, будет делать activate().   -  person Dai    schedule 13.01.2017
comment
да, к сожалению, активация () не делает этого с окнами, по крайней мере, для этого приложения: >> Application('ScreenFlow').activate()=> true >> Application('ScreenFlow').windows[1].activate() !! Error on line 1: TypeError: undefined is not an object (evaluating 'Application('ScreenFlow').windows[1].activate')   -  person Sancarn    schedule 14.01.2017
comment
это не ошибка с activate(), это логическая ошибка скрипта. Что произойдет, если вы используете Cocoa непосредственно из Swift или ObjC?   -  person Dai    schedule 14.01.2017
comment
Есть ли способ выполнить его из ObjC из JXA? - Я никогда раньше не занимался кодированием в ObjC...   -  person Sancarn    schedule 14.01.2017


Ответы (1)


Для выполнения этой работы требуется действие AXRaise:

function setWinFront(n) {
    var system = Application('System Events')
    var ScreenFlow = system.processes['ScreenFlow']
    Screenflow.windows[n].actions['AXRaise'].perform()
}

В будущем, когда вы захотите внести какие-либо изменения, подобные этому, возможно, будет разумно заглянуть в process.windows[1].actions(), чтобы увидеть, существуют ли действия, и если они есть, сначала попробуйте их.

В качестве альтернативы можно также просмотреть атрибуты объекта, используя process.windows[1].attributes()

person Sancarn    schedule 14.01.2017
comment
Три года спустя, но (новичок?) Вопрос, если вы рядом: я пробовал пару вещей, которые, как мне казалось, могут быть очевидными, но я не получаю ничего полезного. Наверное, упустил что-то очевидное... Как выглядит process.windows[1].actions() ? - person DavidT; 24.06.2020
comment
@DavidT iirc process.windows[0].actions() вернет массив действий, например. [Application("System Events").applicationProcesses.byName("ScreenFlow").windows.byName("Untitled").actions.byName("AXRaise")] обратите внимание, что индекс Windows равен 0 (0 — первый элемент) - person Sancarn; 25.06.2020