在Mac上拍摄特定应用程序窗口的截图

3
我正在尝试制作一个屏幕录制应用程序,它可以捕获单个应用程序窗口而不是整个屏幕。首先,我正在尝试使用Xcode在我的Mac上对单个应用程序进行简单的截图。
到目前为止,我正在尝试利用CGWindowListCreateImage,但我遇到了问题。 编辑 这里有一个小例子,说明我如何获取WindowID。之后,使用它来截图非常简单。 首先,您需要添加一个全局事件监视器,更具体地说是NSMouseEvents。我使用鼠标按下。窗口信息存储在鼠标事件中。
    CGWindowID windowID = (CGWindowID)[event windowNumber];

您可以使用以下代码仅截取应用程序的屏幕截图,不包括阴影等。
CGImageRef image = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, self.WindowID, kCGWindowImageBoundsIgnoreFraming);

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


2
你遇到了哪些问题? - El Tomato
实际上我已经修好了!我会在下面发布代码。 - user3339357
2个回答

9

下面是一个小例子,说明我如何获取WindowID。然后使用它来截取屏幕非常简单。首先你需要添加全局事件监控器,具体而言就是NSMouseEvents。我用了鼠标按下事件。窗口信息存储在鼠标事件中。

CGWindowID windowID = (CGWindowID)[event windowNumber];

您可以使用以下代码,仅针对应用程序进行屏幕截图,不包括阴影等内容。
CGImageRef image = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, self.WindowID, kCGWindowImageBoundsIgnoreFraming);

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


那么,如果没有事件怎么办?例如,在我的应用程序中,我只需要另一个应用程序的窗口ID并获取其屏幕截图,而不必先进行鼠标单击操作? - fangmobile
1
不,鼠标点击并不是唯一的方法。你可以获取当前活动窗口及其窗口ID列表,并使用此列表来截取屏幕截图。你可以使用GWindowListCopyWindowInfo API 来实现这一点。 - user3339357
1
直接使用-[NSWindow windowNumber]如何呢? - Ivan Vučica
如果您有多个窗口,它们将具有唯一的窗口号码,因此要获取所需窗口的屏幕截图,您必须知道其窗口号码。这就是为什么您需要某种事件来识别它,例如鼠标单击。 - user3339357
如果我想要在Safari浏览器中截屏,我该如何确定呢? - Emre Gürses

3

根据用户3339357的回答,在Swift 3中

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接