Как я могу получить список всех окон, в настоящее время на экране, в 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]]