Получение фона рабочего стола в какао - PullRequest
1 голос
/ 15 марта 2011

Мне нужно сделать что-то полноэкранное приложение, которое обычно не было бы проблемой.Теперь проблема в том, что мне нужно иметь рабочий стол пользователя, но без значков, в качестве фона моего полноэкранного окна, очень похожего на Launchpad в 10.7.Я получил ссылку на фон рабочего стола в AppleScript:

tell application "Finder"
    set a to desktop picture
end tell

Это дает мне что-то вроде этого: document file "100930-F-7910D-001.jpg" of folder "Pictures" of folder "Fighter Jet Stuff" of folder "Desktop" of folder "tristan" of folder "Users" of startup disk of application "Finder", что я просто не мог понять, чтобы попасть на обычный путь.

Я пытался сделать set a to desktop picture as POSIX path, но это меня подбрасывает.Любая идея о том, как я мог бы сделать это в Какао, используя вышеупомянутый Applescript, чтобы получить путь, или даже лучше, без Applescript?Я не хотел бы полагаться на конкретный формат любого списка, в котором может храниться эта информация, поскольку в дальнейшем он может сломаться.Я думаю, что может быть структура, о которой я просто не знаю ...

Ответы [ 2 ]

7 голосов
/ 15 марта 2011

Методы, которые вы ищете, доступны в NSWorkspace.

– desktopImageURLForScreen:
– setDesktopImageURL:forScreen:options:error:
– desktopImageOptionsForScreen:

Пожалуйста, ознакомьтесь с документацией здесь: Справочник по классам NSWorkspace

0 голосов
/ 03 октября 2015

Если вам нужны только текущие обои, вы можете сделать их скриншот:

extension NSImage {

    static func desktopPicture() -> NSImage {

        let windows = CGWindowListCopyWindowInfo(
            CGWindowListOption.OptionOnScreenOnly,
            CGWindowID(0))! as NSArray

        var index = 0
        for var i = 0; i < windows.count; i++  {
            let window = windows[i]

            // we need windows owned by Dock
            let owner = window["kCGWindowOwnerName"] as! String
            if owner != "Dock" {
                continue
            }

            // we need windows named like "Desktop Picture %"
            let name = window["kCGWindowName"] as! String
            if !name.hasPrefix("Desktop Picture") {
                continue
            }

            // wee need the one which belongs to the current screen
            let bounds = window["kCGWindowBounds"] as! NSDictionary
            let x = bounds["X"] as! CGFloat
            if x == NSScreen.mainScreen()!.frame.origin.x {
                index = window["kCGWindowNumber"] as! Int
                break
            }
        }

        let cgImage = CGWindowListCreateImage(
            CGRectZero,
            CGWindowListOption(arrayLiteral: CGWindowListOption.OptionIncludingWindow),
            CGWindowID(index),
            CGWindowImageOption.Default)!

        let image = NSImage(CGImage: cgImage, size: NSScreen.mainScreen()!.frame.size)
        return image
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...