Swift: Mac의 데스크톱 배경 그림 가져오기

10203 단어 Swift

개요


Mac의 배경 그림을 어떻게든 뽑으려는 상황에서 사용되는 코드입니다. CGWindow의 좌표계는 NSScreen의 좌표계와 다르기 때문에 다중 디스플레이를 지원하기 어렵습니다.

출처


Extension
import Cocoa

extension NSScreen {
    static var mainHeight: CGFloat {
        return main?.frame.height ?? CGFloat.zero
    }
    static var totalRect: CGRect {
        return screens.reduce(CGRect.zero) { (result, screen) -> CGRect in
            return result.union(screen.frame)
        }
    }
}

extension NSImage {
    static func background(_ frame: CGRect) -> NSImage? {
        guard var list = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) as? [NSDictionary] else {
            return nil
        }
        let origin = CGPoint(x: frame.minX, y: NSScreen.mainHeight - frame.maxY)
        list = list.compactMap({ (dict) -> NSDictionary? in
            guard let name = dict[kCGWindowName] as? String, name.contains("Desktop Picture") else { return nil }
            let bounds = dict[kCGWindowBounds] as! NSDictionary
            guard CGPoint(x: bounds["X"] as! CGFloat, y: bounds["Y"] as! CGFloat).equalTo(origin) else { return nil }
            return dict
        })
        guard
            let dict = list.first, let id = dict[kCGWindowNumber] as? CGWindowID,
            let cgImage = CGWindowListCreateImage(CGRect.null, .optionIncludingWindow, id, .boundsIgnoreFraming)
            else { return nil }
        return NSImage(cgImage: cgImage, size: frame.size)
    }
}
사용 예
func getMainScreenBackground() -> NSImage? {
    guard let screen = NSScreen.main else { return nil }
    return NSImage.background(screen.frame)
}

func getAllScreenBackgrounds() -> [NSImage] {
    return NSScreen.screens.compactMap { (screen) -> NSImage? in
        return NSImage.background(screen.frame)
    }
}


CGWindow의 좌표계와 NSScreen의 좌표계와 CGImage의 좌표계의 차이.
나는 당신이 좌표의 변환이 상당히 번거롭다는 것을 발견할 것이라고 생각한다.

한 걸음 더 앞으로


App Sand Box가 필요 없는 경우
let url = NSWorkspace.shared.desktopImageURL(for: NSScreen.main!)!
let image = NSImage(contentsOf: url)
이렇게 하면 NSWorkspace에서 직접 이미지 소스를 가져올 수 있습니다.

좋은 웹페이지 즐겨찾기