【发布时间】:2018-08-16 14:15:56
【问题描述】:
如何以编程方式在 mac os 应用程序中将桌面图像设置为 NSWindow 背景图像。假设如果我单击一个按钮,那么无论桌面图像在那里,它都应该应用于 NSWindow 背景。
【问题讨论】:
标签: objective-c macos background-image nswindow
如何以编程方式在 mac os 应用程序中将桌面图像设置为 NSWindow 背景图像。假设如果我单击一个按钮,那么无论桌面图像在那里,它都应该应用于 NSWindow 背景。
【问题讨论】:
标签: objective-c macos background-image nswindow
要获取屏幕的桌面图像,请使用NSWorkspace 提供的方法。
desktopImageURLForScreen: 方法返回图像文件的 URL,而 desktopImageOptionsForScreen: 方法返回桌面图像选项字典 - 图像应如何缩放、是否应平铺等。
使用这些方法和NSImageView,您应该能够以适当的比例、平铺和对齐方式显示桌面图像作为窗口背景。如果您在多屏系统上支持跨屏窗口,它会涉及更多,但方法基本相同。
HTH
【讨论】:
如果应用没有沙盒化,CRD 建议确实有效。如果是,那么您就无法对NSWorkspace.shared.desktopImageURL(for: screen) 做任何事情。
您可以使用 Core Graphics 并获取桌面的图片:
extension NSImage {
static func desktopPictures() -> [NSImage] {
let info = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) as? [[ String : Any]]
var images = [NSImage]()
for window in info! {
// 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
}
// this belongs to a screen
let index = window["kCGWindowNumber"] as! CGWindowID
let cgImage = CGWindowListCreateImage(CGRect.infinite, CGWindowListOption(arrayLiteral: CGWindowListOption.optionIncludingWindow), index, CGWindowImageOption.nominalResolution)
images.append(NSImage(cgImage: cgImage!, size: NSMakeSize(CGFloat(cgImage!.width), CGFloat(cgImage!.height))))
}
// return the array of Desktop images
return images
}
}
然后获取桌面图像
NSImage.desktopPictures()
感谢Cocoa: take screenshot of desktop wallpaper (without icons and windows) 和How to get window list from core-grapics API with swift
【讨论】: