Как я могу получить список всех окон, в настоящее время на экране, в swift?

Как я могу получить список всех окон, находящихся в настоящее время на экране, в swift? (всем примерам предшествует import Cocoa)

В objective-c Я могу запустить следующий код успешно:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);

Но когда я запускаю эквивалент в swift (используя тестовую площадку для тестирования):

let windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kcGNullWindowID)

Я получаю сообщение об ошибке, указывающее, что у меня есть Use of unresolved identifier 'kcGNullWindowID'.

После игры с помощью кварцевой документации какое-то время я получил:

let windowList = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowListOptionOnScreenOnly), CGWindowListOption(0))

Но он по-прежнему не работает, поскольку я получаю объект {__NSArrayM}, который я не знаю, как получить доступ.

Я на правильном пути, или я делаю что-то принципиально неправильное?

Ответ 1

Вот пример в Swift 2.0, который также демонстрирует несколько параметров.

    let options = CGWindowListOption(arrayLiteral: CGWindowListOption.ExcludeDesktopElements, CGWindowListOption.OptionOnScreenOnly)
    let windowListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0))
    let infoList = windowListInfo as NSArray? as? [[String: AnyObject]]

Ответ 2

Используйте takeUnretainedValue() или takeRetainedValue() на windowList.

Ознакомьтесь с Apple с помощью Swift с Cocoa и Objective-C и прочитайте раздел Работа с Cocoa Типы данных и найдите неуправляемые объекты.

Вот конкретный пример:

import Cocoa

let windowInfosRef = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowListOptionOnScreenOnly), CGWindowID(0))
let windowInfos = windowInfosRef.takeRetainedValue().__conversion() // cast to swift dictionary
println(windowInfos) // print the swift dictionary

Ответ 3

Здесь моя версия для Swift 1.2. Он более подробно описывает типы, так как мы знаем, что функция возвращает массив словарей со строковыми ключами.

let options = CGWindowListOption(kCGWindowListOptionOnScreenOnly)
let cfInfoList = CGWindowListCopyWindowInfo(options, CGWindowID(0)).takeRetainedValue()
let infoList = cfInfoList as NSArray as? [[String: AnyObject]]