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

142
11

Как я могу получить список всех окон, находящихся в настоящее время на экране, в 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}, который я не знаю, как получить доступ.


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

спросил(а) 2014-06-07T09:18:00+04:00 6 лет, 10 месяцев назад
1
Решение
177

Вот пример в 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]]

ответил(а) 2015-07-12T14:52:00+03:00 5 лет, 9 месяцев назад
115

Используйте 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

ответил(а) 2014-06-07T09:57:00+04:00 6 лет, 10 месяцев назад
61

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


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

ответил(а) 2015-05-28T22:19:00+03:00 5 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема