- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果您调用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 屏幕截图示例程序避免 try catch kCGWindowSharingNone 窗口,但我找不到一个很好地描述了这些状态的用途。
一个简单的测试似乎表明 OS X 附带的几个应用程序确实有设置为 kCGWindowSharingNone 的窗口,特别是 Notes 和 iBooks。据我所知,通过快速测试,将窗口设置为 kCGWindowSharingNone 实际上并不能阻止 CGWindowListCreateImage() 捕获该窗口的图像。我找不到将 kCGWindowSharingReadWrite 设置为共享模式的窗口。
是否所有这些都在文档的某处进行了解释,而我只是错过了它,或者它只是几乎没有记录的 Core Graphics 功能?是否有充分的理由不 try catch kCGWindowSharingNone 窗口,如果我尝试这样做,将来会不会给自己带来麻烦?
进一步的调查表明,当 Cocoa 应用调用
[NSWindow setSharingType:]
在窗口上设置kCGWindowSharingStateNone,并防止它被CGWindowListCreateImage()捕获。还有一些其他窗口设置了 kCGWindowSharingStateNone,但可以成功捕获 - 特别是,iBooks 创建了这样的窗口。
这可能是 iBooks 中的错误,或者它调用的任何 API 中的错误(因为它不调用 NSWindow API)。
最佳答案
如果您打算忽略一个窗口的共享状态,您应该准备好让一些窗口的行为与 API 指定的一样,而根据您自己的研究显然有些不是。
在 Cocoa API 的更高层,NSWindow有一个 sharingType
属性。将其设置为 NSWindowSharingTypeNone
会使相应的 CGWindow
具有 kCGWindowSharingNone
的共享类型。
当我在我自己的应用程序的窗口上更改此属性时,它会阻止其他应用程序使用 CGWindow API 捕获窗口的内容。 CGWindowListCreateImage
的文档似乎也是正确的。
Any windows that are onscreen but whose sharing setting is set to kCGWindowSharingNone are skipped and not included in the resulting image.
当我截取应包含私有(private)窗口的多窗口屏幕截图时,屏幕截图中缺少该窗口。
在您自己的应用程序中这样做的一个原因是防止图形内容被复制。
我不知道为什么 iBooks 和 Notes 会出现您描述的行为。我可以想象 Apple 不希望用户能够从 iBook 复制内容,但这显然没有发生,并且对 Notes 没有意义(顺便说一下,Notes 的窗口在 10.10.2 中似乎是正常的)。
我不知道有什么方法可以利用窗口内容的读/写类型。
关于objective-c - kCGWindowSharingState 实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27695742/
如果您调用CGWindowListCopyWindowInfo(),您返回的CFDictionaryRef 包含一个数字keys and values .其中之一是 kCGWindowSharingS
我是一名优秀的程序员,十分优秀!