【问题标题】:Place window directly behind active window将窗口直接放在活动窗口的后面
【发布时间】:2015-10-01 19:20:05
【问题描述】:

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

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

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

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

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

有人知道怎么做吗?

【问题讨论】:

    标签: macos swift cocoa


    【解决方案1】:

    您不能为来自另一个应用程序的窗口创建NSWindow 的实例。您只能为应用的窗口创建窗口对象。

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

    如果您不认为是窗口的窗口(例如菜单栏和 Dock 等)包含在该列表中,我不记得临时的情况。我认为他们是。

    此外,窗口级别优先于像orderWindow(_:relativeTo:) 这样的排序操作。也就是说,如果有多个浮动窗口并且您的窗口是正常的非浮动窗口,那么将您的窗口立即放在前面浮动窗口的后面不会将它放在其他浮动窗口的前面。所有浮动窗口将始终位于所有正常的非浮动窗口之前。因此,如果您希望您的窗口位于最前面的窗口之后,而不管其级别如何,您必须弄清楚它的级别并将您的窗口设置为具有相同的级别。 (注意:设置窗口的层级会将其移动到该层级的前面。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 2015-04-03
      • 2012-02-20
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多