大家好我正在开发一个小型的跨平台爱好/教育项目,它可以截取所有显示器的屏幕截图,并用一个宽窗口覆盖所有显示器。现在在Windows和GTK系统上这没问题。但是我在OSX上遇到了问题:
有没有任何编程方法来实现这一目标?用户非常喜欢在拍摄截图时,它会覆盖所有显示器并进行捕获,然后裁剪并单击上传到图像服务等。我只想在OSX上为他们带来相同的体验。
由于
答案 0 :(得分:2)
在OS X 10.9中,Apple推出了一项名为"显示器具有独立空间的功能"。请参阅系统偏好设置的任务控制面板。它默认开启。
当打开时,没有窗口可以跨越多个监视器。即使它以编程方式设置了框架,它也只会出现在包含窗口大部分区域的屏幕上。窗口将被剪切到该屏幕的框架。
因此,您必须为每个屏幕创建一个单独的窗口。
空格和多个屏幕
在10.9中,我们添加了一个功能 每个屏幕都有自己的空间集,并且可以切换 一个屏幕上的空间之间没有扰乱空间 其他屏幕。在此模式下,全屏窗口使用一个屏幕,和 留下任何其他屏幕的内容不变。 ...
启用此功能后,窗口可能无法跨越显示屏。 将为包含大部分窗口的显示分配一个窗口 它的几何形状,如果以编程方式定位在跨越位置。一个 窗口将被分配给包含鼠标的显示器 窗口由用户移动。一扇窗户夹在边缘 显示,是否有另一个相邻的显示器。
此外,由于菜单栏出现在所有屏幕上,Apple改变了窗口限制在屏幕上的方式。另外,来自10.9 AppKit release notes:
constrainFrameRect:toScreen:现在为无边框窗口调用
在此之前 到10.9,NSWindow方法 - [NSWindow constraintFrameRect:toScreen:] 仅在其中设置了NSTitledWindowMask的窗口中调用 styleMask。在10.9中,为所有窗口调用此方法。该 默认实现对非标题的限制更有限 窗口,如“NSWindows约束不相交 菜单栏“下面。
NSWindows被限制为不与菜单栏相交
10.9,in 支持新的多显示器架构,现在是Windows 约束不与其包含空间上的菜单栏相交。 这个限制已经适用于标题窗口,但它有 被扩展到无边界窗口,其级别至少是 NSNormalWindowLevel但小于NSMainMenuWindowLevel。这种行为 在 - [NSWindow constraintFrameRect:toScreen:]中实现。你可以 在NSWindow子类中重写该方法以调整或防止这种情况 约束
因此,您必须使用NSWindow
的自定义子类覆盖-constrainFrameRect:toScreen:
以返回无约束的帧,或者您必须将窗口level
设置为{ {1}}或更高。