Установка самого переднего окна с помощью API специальных возможностей - PullRequest
5 голосов
/ 22 января 2010

Я хочу установить определенное окно из внешнего приложения (например, textedit), чтобы оно было впереди большинства.

Я могу успешно получить ссылку на само приложение, используя GetFrontProcess, и проверить, является ли оно наиболее передним. Если это не так, я могу использовать setFrontProcess, чтобы сделать его сфокусированным.

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

//get the front window of textEditApp and store it in 'currentFrontWindow'
    AXUIElementCopyAttributeValue(textEditApp, kAXFocusedWindowAttribute, (CFTypeRef *)&currentFrontWindow);

Если интересующее меня окно не является передним, мне нужно установить его так. Я думал, что мог бы использовать AXUIElement Set AttributeValue, чтобы сделать это, но я не получаю никакого успеха. Вот как я пытался это сделать.

//set the front window of textEditApp to be desiredFrontWindow
AXUIElementSetAttributeValue(textEditApp, kAXFocusedUIElementAttribute, desiredFrontWindow);

Я проверил, что окно существует, и приложение успешно «переключено». Но почему эта строка кода не выводит указанное окно вперед?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 22 января 2010

Но почему эта строка кода не выводит указанное окно вперед?

Поскольку вы пытались установить атрибут только для чтения.

Для того, чтобы сделать окно передним, вам нужно установить соответствующее свойство окна. То же самое относится и к приложению: чтобы сделать приложение первым, вам необходимо установить соответствующее свойство приложения.

Название Cocoa / Mac OS X для переднего окна - «главное окно». (См., Например, NSApplication и NSWindow методы , относящиеся к этой концепции.) Специальные возможности используют одно и то же имя, поэтому, чтобы сделать одно окно передним, установите значение его kAXMainAttribute до kCFBooleanTrue.

Способ сделать приложение самым передним аналогичен: установите значение kAXFrontmostAttribute равным kCFBooleanTrue. Вам нужно будет выполнить оба этих действия, чтобы установить переднее окно приложения и сделать приложение активным.

Насколько я могу судить, нет способа вывести только одно окно приложения на передний план и выделить ему фокус сеанса.

3 голосов
/ 26 октября 2015

Мне удалось сделать это в приложении. Я работал над , перенеся приложение на передний план, а затем перенеся одно окно на передний план.

Сначала выведите приложение наfront:

let currentPid = NSRunningApplication.currentApplication().processIdentifier
if let pid = (the pid of the app in question) where pid != currentPid {
  NSRunningApplication(processIdentifier: pid)?.activateWithOptions(.ActivateIgnoringOtherApps)
}

Затем отправляем окно на фронт:

let window = (window AXUIElement)
AXUIElementSetAttributeValue(window, NSAccessibilityMainAttribute, true)
1 голос
/ 22 июля 2011

Я недавно обнаружил, что, если вы не возражаете против какого-то углерода, вы можете использовать SetFrontProcessWithOptions , чтобы вывести окно на передний план и выделить его, если вы передаете kSetFrontProcessFrontWindowOnly в качестве второго аргумента.

...