【发布时间】:2015-02-26 01:04:52
【问题描述】:
如果你调用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)。
【问题讨论】:
标签: objective-c macos cocoa core-graphics quartz-graphics