【问题标题】:What does kCGWindowSharingState actually do?kCGWindowSharingState 实际上做了什么?
【发布时间】: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


    【解决方案1】:

    如果您要忽略窗口的共享状态,您应该准备好让某些窗口按照 API 指定的方式运行,而显然根据您自己的研究,有些则不是。

    在 Cocoa API 的更高层,NSWindow 有一个 sharingType 属性。将其设置为NSWindowSharingTypeNone 会使对应的CGWindow 具有kCGWindowSharingNone 的共享类型。

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

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

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


    在您自己的应用程序中这样做的一个原因是防止图形内容被复制出来。

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

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

    【讨论】:

    • "Notes" 似乎在 10.9.5 上的 NSWindowSharingTypeNone 和 NSWindowSharingTypeReadOnly 之间来回切换,但触发的原因尚不清楚。此外,我刚刚尝试使用 SonOfGrab,它在捕获屏幕截图(使用 CGWindowListCreateImage)时捕获 iBooks 窗口作为图像的一部分,尽管 iBooks 已将其窗口设置为 kCGWindowSharingNone。我必须在 10.10 上检查一下 - 也许那里有些不同。
    • 对。带有看起来是私有窗口的 Apple 应用程序不会这样做。但是当我在自己的窗口上使用NSWindowSharingTypeNone 时,Grab、SonOfGrab 和我自己的窗口捕获代码完全尊重窗口的隐私。
    • 好吧,这很奇怪。当您使用 NSWindow 方法时,也许该标志也被设置在其他地方。
    • 我刚刚验证了 iBooks 不调用 [NSWindow setSharingType:]。他们必须使用其他一些 API 才能将共享标志设置为无。我想我必须实际检查是否可以捕获窗口,以确定它是否“真正”私有。
    • iBooks 可以被捕获,所以它不是真正的私密。我只是提出了将内容保密的想法,因为这在 iBooks 中是有意义的。这在 iTunes 中也很有意义,但它们采用了一些其他机制来防止您从电影中获取连续的图像流。
    猜你喜欢
    • 2013-06-02
    • 2020-11-21
    • 2017-06-29
    • 2013-06-13
    • 2021-10-25
    • 2011-08-12
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多