kCGWindowSharingState实际上做了什么?

时间:2014-12-29 20:45:29

标签: objective-c macos cocoa core-graphics quartz-graphics

如果您调用 CGWindowListCopyWindowInfo(),则您获得的 CFDictionaryRef 包含多个keys and values。其中一个是 kCGWindowSharingState ,它有三个可能的值:

Window Sharing Constants
Specifies whether and how windows are shared between applications.

enum {
   kCGWindowSharingNone      = 0,
   kCGWindowSharingReadOnly  = 1,
   kCGWindowSharingReadWrite = 2
};

我系统上的几乎所有窗口都是 kCGWindowSharingReadOnly ,而SonOfGrab屏幕截图示例程序避免尝试捕获 kCGWindowSharingNone 窗口,但我找不到很好地描述了这些状态的用途。

一个简单的测试似乎表明,OS X附带的几个应用程序的窗口设置为 kCGWindowSharingNone ,特别是Notes和iBooks。据我所知,通过快速测试,将窗口设置为 kCGWindowSharingNone 实际上并不会阻止 CGWindowListCreateImage()捕获该窗口的图像。我找不到将 kCGWindowSharingReadWrite 设置为共享模式的窗口。

所有这些都在文档中的某处解释过,我只是错过了它,或者它只是更难以记录的Core Graphics功能?是否有充分的理由不尝试捕获 kCGWindowSharingNone 窗口,如果我尝试这样做,我将来会为自己设置麻烦吗?


进一步调查显示,当Cocoa应用程序调用

[NSWindow setSharingType:]

在窗口上设置 kCGWindowSharingStateNone 阻止 CGWindowListCreateImage()捕获它。还有一些其他窗口设置了 kCGWindowSharingStateNone ,但可以成功捕获 - 尤其是iBooks会创建一个这样的窗口。

这可能是iBooks中的一个错误,或者是它调用的任何API(因为它没有调用NSWindow API)。

1 个答案:

答案 0 :(得分:6)

如果您要忽略窗口的共享状态,您应该准备好让某些窗口像API指定的那样运行,并且显然根据您自己的研究,有些窗口没有。

在Cocoa API中,NSWindow具有sharingType属性。将其设置为NSWindowSharingTypeNone会使相应的CGWindow共享类型为kCGWindowSharingNone

当我在自己的应用程序中的窗口上更改此属性时,它会阻止其他应用程序使用CGWindow API捕获窗口的内容。 CGWindowListCreateImage的文档似乎也是正确的。

  

屏幕上显示但共享设置为kCGWindowSharingNone的所有窗口都会跳过,并且不会包含在生成的图像中。

当我拍摄应包含私人窗口的多窗口截图时,屏幕截图中缺少该窗口。


可能在您自己的应用程序中执行此操作的原因是为了防止图形内容被复制出来。

我不知道为什么iBooks和Notes会展示你描述的行为。我可以想象Apple不希望用户能够从iBook复制内容,但这显然没有发生,并且对Notes没有意义(顺便说一句,Notes'窗口似乎是正常的在10.10.2)。

我不知道如何利用窗口内容的读/写类型。