【问题标题】:For macOS Cocoa, how do I specify a window or a rectangle on the screen for taking a screenshot?对于 macOS Cocoa,如何在屏幕上指定一个窗口或一个矩形来截取屏幕截图?
【发布时间】:2020-08-27 02:50:49
【问题描述】:

我已经编写了一个用于测量图像文件的 macOS 应用程序,我希望添加一个用于捕获屏幕截图的功能。我希望它有一个用户界面,就像 macOS 应用程序“预览”一样。

要使用它的屏幕截图功能,请执行“文件”>“截图”,然后会获得一个包含以下选项的子菜单:

  • 从选择...
  • 从窗口...
  • 从整个屏幕

“从选择...”让您通过单击和拖动来选择屏幕上的一个矩形。

“从窗口...”让您选择一个应用程序窗口。

“从整个屏幕”就是它所说的。

我可以找到将屏幕截图作为图像对象的代码,但我无法找到用户界面部分、选择矩形或窗口的部分的任何代码。有谁知道这是怎么做到的吗?或者有一些代码可以做到这一点。

【问题讨论】:

    标签: macos user-interface cocoa screenshot


    【解决方案1】:

    下面的代码应该给你一个窗口截图:

    @objc func myBtnAction(_ sender:AnyObject ) {
     let windowID : Int = window!.windowNumber
     let windowImage: CGImage? = CGWindowListCreateImage(.null, .optionIncludingWindow, CGWindowID(windowID), [.nominalResolution])
     let bitmapRep = NSBitmapImageRep(cgImage: windowImage!)
     let image = NSImage()
     image.addRepresentation(bitmapRep)
     let pngData = bitmapRep.representation(using: .png, properties:[:])
     // your fileURL here
     let fileURL = URL(fileURLWithPath: "/Users/xxxx/Desktop/WndShot.png")
     do {
       try pngData!.write(to: fileURL)
       print("File saved: \(fileURL.absoluteURL)")
       } catch {
       print(error.localizedDescription)
      }
    }
    
    

    我关闭了沙盒。

    【讨论】:

    • 那是为了从窗口中获取图像数据,我在问如何以 GUI 方式选择窗口,就像在预览中所做的那样。还有关于单击和拖动以制作选择矩形。
    • shift-cmd-4 有可能吗?
    • 我已经实现了从剪贴板获取图像,因此在没有直接执行此操作的代码的情况下,这将是一个很好的解决方法。
    【解决方案2】:

    尝试调用screencapture 命令行工具:

    screencapture -i -c
    

    这将运行默认的 macOS 界面以选择屏幕上的区域并将捕获的图像存储在剪贴板上。请改用-Jwindow 来捕获窗口:

    screencapture -i -c -Jwindow
    

    或者将-i 标志替换为-S 标志以非交互方式捕获整个屏幕:

    screencapture -S -c -Jwindow
    

    【讨论】:

    • 所以我会使用 NSTask 来生成一个运行它的进程?由于我已经使用剪贴板实现了,这可能会起作用。
    • 是的,您可以为此使用 NSTask。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多