Какао: сделать скриншот обоев рабочего стола (без значков и окон) - PullRequest
4 голосов
/ 10 ноября 2011

Возможно ли захватить рабочий стол Mac OS X без элементов рабочего стола и каких-либо открытых окон (т.е. только обоев)?

Я экспериментировал с CGWindowListCreateImage, CGWindowListCreateImageFromArray иCGDisplayCreateImage, но не повезло.

По сути, я пытаюсь захватить обои рабочего стола без использования [NSWorkspace desktopImageURLForScreen:] (это изолированное приложение без доступа к файловой системе).

Ответы [ 3 ]

5 голосов
/ 17 ноября 2011

Вы должны быть осторожны, чтобы проверить, что это все еще правильно, но окно рабочего стола находится ниже Finder (оно рисуется Dock). Передача kCGWindowListOptionOnScreenBelowWindow CGWindowListOption на CGWindowListCreateImage должна дать вам то, что вы хотите (если что-то еще не рисует ниже этого уровня).

В противном случае вам нужно будет использовать CGWindowListCreate и выполнить итерацию ответа, исключая все, что не нарисовано доком на уровне окна kCGMinimumWindowLevel + 19.

Это довольно сложно, когда есть несколько экранов, но, надеюсь, этой информации вам достаточно, чтобы сделать то, что вам нужно.

4 голосов
/ 22 апреля 2012

Я знаю, что это очень старый вопрос, и вопрос Тони Арнольда является правильным, и то, что я использовал, чтобы создать свой собственный код "захватить рабочий стол".

У меня есть пример кода, который показывает, как это сделатьвсе эти вещи (это замечательная вещь, проходящая в частях Какао, которые едва документированы ...)

Я поместил этот пример кода в репозиторий bitbucket.В частности пример кода для съемки .(В моем обучающем хранилище Cocoa , откуда взят этот пример кода, есть более интересный код Какао)

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

Swift версия:

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
    }
}
...