【问题标题】:Take screenshots of specific application window on Mac在 Mac 上截取特定应用程序窗口的屏幕截图
【发布时间】:2014-02-22 00:03:57
【问题描述】:

我正在尝试制作一个屏幕投射应用程序,它投射单个应用程序窗口而不是整个屏幕。首先,我尝试使用 Xcode 在我的 Mac 上对单个应用程序进行简单的截图。

到目前为止,我正在尝试使用CGWindowListCreateImage,但我遇到了问题。

编辑 所以这里有一个小例子,说明我如何设法获得 WindowID。之后使用它截取屏幕截图非常简单。 首先为事件添加一个全局监视器,更具体地说是 NSMouseEvents。我用鼠标向下。窗口信息存储在鼠标事件中。

    CGWindowID windowID = (CGWindowID)[event windowNumber];

然后,您可以使用下面的代码截取应用程序的屏幕截图,没有阴影等。

CGImageRef image = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, self.WindowID, kCGWindowImageBoundsIgnoreFraming);

如果您需要更多,请告诉我。

【问题讨论】:

  • 您遇到了什么问题?
  • 其实我修好了!我将在下面发布代码。

标签: macos quartz-graphics


【解决方案1】:

下面是一个小例子,说明我是如何获得 WindowID 的。之后使用它截取屏幕截图非常简单。首先为事件添加一个全局监视器,更具体地说是 NSMouseEvents。我用鼠标向下。窗口信息存储在鼠标事件中。

CGWindowID windowID = (CGWindowID)[event windowNumber];

然后,您可以使用下面的代码截取应用程序的屏幕截图,没有阴影等。

CGImageRef image = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, self.WindowID, kCGWindowImageBoundsIgnoreFraming);

如果您需要更多,请告诉我。

【讨论】:

  • 那么,如果没有事件呢?例如在我的应用程序中,我只需要另一个应用程序的 windowID 并对其进行截图,而无需先单击鼠标?
  • 不,鼠标点击不是唯一的方法。您可以获取当前活动窗口的列表及其窗口 ID,并使用它来截取屏幕截图。您可以使用 GWindowListCopyWindowInfo API 来完成此操作
  • 简单地使用 -[NSWindow windowNumber] 怎么样?
  • 如果你有多个窗口,它们会有唯一的窗口编号,所以要获得你想要的窗口的截图,你必须知道它的窗口编号。这就是为什么你需要某种事件来识别它,比如鼠标点击。
  • 如果我要截取safari浏览器截图,如何确定?
【解决方案2】:

基于 user3339357 的回答,在 Swift 3 中

let gImage = CGWindowListCreateImage(
      CGRect.null,
      CGWindowListOption.optionIncludingWindow,
      CGWindowID(window.windowNumber),
      CGWindowImageOption.bestResolution)

let image = NSImage(cgImage: cgImage!, size: window.frame.size)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 2011-06-12
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多