将窗口直接放在活动窗口

时间:2015-10-01 19:20:06

标签: macos swift cocoa

我想在窗口最高的窗口后面放置一个窗口,而不仅仅是我应用程序中具有最高级别的窗口,但是对于所有活动的应用程序。

我的第一个想法是做这样的事情

let activeWindow = //Problems finding a reference to this window.

myWindow.makeKeyAndOrderFront(nil)
activeWindow.makeKeyAndOrderFront(nil)

通过这种方式,我将获得对活动窗口的引用。将我的窗口置于顶部,然后再将上一个活动窗口重新定位在顶部。然后所有其他窗户都将位于我的下方。

有人知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

您无法为其他应用的窗口创建NSWindow的实例。您只能拥有应用程序窗口的窗口对象。

您可以使用orderWindow(_:relativeTo:)在另一个窗口的上方或下方订购窗口,该窗口由其窗口编号标识。您可以拥有其他应用的窗口号。您可以使用NSWindow.windowNumbersWithOptions(NSWindowNumberListAllApplications)从任何应用程序获取当前空间上所有窗口的窗口编号。结果列表中的第一个窗口编号是前面的窗口编号。

我不记得,如果您不认为是窗户的窗户 - 例如菜单栏和Dock等等 - 都包含在该列表中。我认为他们是。

此外,窗口级别优先于orderWindow(_:relativeTo:)等排序操作。也就是说,如果有多个浮动窗口并且您的窗口是一个普通的非浮动窗口,那么将窗口命名为紧靠前浮动窗口的后面将不会将其放在其他浮动窗口的前面。所有浮动窗口始终位于所有正常的非浮动窗口的前面。因此,如果您希望窗口位于最前面的窗口后面而不管其级别如何,则必须确定其级别并将窗口设置为具有相同级别。 (注意:设置窗口的级别会将其移动到该级别的前面。)

您还可以使用CGWindowList API获取有关Windows的信息(例如CGWindowListCopyWindowInfo())。虽然我的知识从未正式记录,但该API返回的描述词典的kCGWindowNumber键似乎与Cocoa的窗口编号相对应。其他一些键可以帮助您过滤菜单栏和Dock等内容。同样,他们可以通过kCGWindowLayer为您提供其他应用窗口的窗口级别。