【问题标题】:How to set desktop image to NSWindow programmatically objective c?如何以编程方式将桌面图像设置为 NSWindow 目标 c?
【发布时间】:2018-08-16 14:15:56
【问题描述】:

如何以编程方式在 mac os 应用程序中将桌面图像设置为 NSWindow 背景图像。假设如果我单击一个按钮,那么无论桌面图像在那里,它都应该应用于 NSWindow 背景。

【问题讨论】:

标签: objective-c macos background-image nswindow


【解决方案1】:

要获取屏幕的桌面图像,请使用NSWorkspace 提供的方法。

desktopImageURLForScreen: 方法返回图像文件的 URL,而 desktopImageOptionsForScreen: 方法返回桌面图像选项字典 - 图像应如何缩放、是否应平铺等。

使用这些方法和NSImageView,您应该能够以适当的比例、平铺和对齐方式显示桌面图像作为窗口背景。如果您在多屏系统上支持跨屏窗口,它会涉及更多,但方法基本相同。

HTH

【讨论】:

    【解决方案2】:

    如果应用没有沙盒化,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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2019-01-24
      • 2010-09-13
      • 2012-09-08
      • 2011-07-24
      相关资源
      最近更新 更多