调整窗口大小并重新定位以跨越所有监视器

时间:2015-07-12 04:43:49

标签: objective-c macos core-foundation

大家好我正在开发一个小型的跨平台爱好/教育项目,它可以截取所有显示器的屏幕截图,并用一个宽窗口覆盖所有显示器。现在在Windows和GTK系统上这没问题。但是我在OSX上遇到了问题:

  1. 第一个主要问题是窗户没有覆盖码头的非工作区域和顶部的菜单栏。
  2. 它不会调整大小以跨越多个监视器。
  3. 有没有任何编程方法来实现这一目标?用户非常喜欢在拍摄截图时,它会覆盖所有显示器并进行捕获,然后裁剪并单击上传到图像服务等。我只想在OSX上为他们带来相同的体验。

    由于

1 个答案:

答案 0 :(得分:2)

在OS X 10.9中,Apple推出了一项名为"显示器具有独立空间的功能"。请参阅系统偏好设置的任务控制面板。它默认开启。

当打开时,没有窗口可以跨越多个监视器。即使它以编程方式设置了框架,它也只会出现在包含窗口大部分区域的屏幕上。窗口将被剪切到该屏幕的框架。

因此,您必须为每个屏幕创建一个单独的窗口。

来自10.9 AppKit release notes

  

空格和多个屏幕

     

在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}}或更高。