kCGWindowSharingState实际上做了什么?

Mar*_*sey 9 macos cocoa core-graphics objective-c quartz-graphics

如果调用CGWindowListCopyWindowInfo(),则返回的CFDictionaryRef包含许多键和值.其中一个是kCGWindowSharingState,它有三个可能的值:

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

enum {
   kCGWindowSharingNone      = 0,
   kCGWindowSharingReadOnly  = 1,
   kCGWindowSharingReadWrite = 2
};
Run Code Online (Sandbox Code Playgroud)

我系统上的几乎所有窗口都是kCGWindowSharingReadOnly,SonOfGrab屏幕截图示例程序避免尝试捕获kCGWindowSharingNone窗口,但我找不到这些状态用于什么的良好描述.

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

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


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

[NSWindow setSharingType:]
Run Code Online (Sandbox Code Playgroud)

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

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

Fab*_*ian 6

如果你要忽略一个窗口的共享状态,你应该准备让一些窗口像API指定的那样运行,显然根据你自己的研究,有些不是.

NSWindow位于Cocoa API的较高位置,拥有一处sharingType房产.设置NSWindowSharingTypeNone使相应的CGWindow具有共享类型kCGWindowSharingNone.

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

屏幕上但其共享设置设置为kCGWindowSharingNone的任何窗口都将被跳过,并且不会包含在生成的图像中.

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


在您自己的应用程序中可能会这样做的原因是为了防止图形内容被复制出来.

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

我不知道有什么方法可以利用窗口内容的读/写类型.