【问题标题】:Get NSWindow* from CGWindowListCopyWindowInfo从 CGWindowListCopyWindowInfo 获取 NSWindow*
【发布时间】:2015-10-31 14:39:02
【问题描述】:

我已经完成了使用CGWindowListCopyWindowInfo 列出所有窗口(我认为/希望从前到后的 z 顺序),但我无法从中获取NSWindow*,因此我可以与orderFront: 等一起使用。

我好像连CGWindowID都没有。

这是我的代码,它是 js-ctypes。

var cfarr_win = ostypes.API('CGWindowListCopyWindowInfo')(ostypes.CONST.kCGWindowListOptionAll | ostypes.CONST.kCGWindowListExcludeDesktopElements, ostypes.CONST.kCGNullWindowID);

var cnt_win = ostypes.API('CFArrayGetCount')(cfarr_win);

for (var i = 0; i < cnt_win; i++) {
    var thisWin = {};
    // trying to get NSWindow* to the window here, so i can use with orderFront: etc

    // example on how i get pid:
    var rez_pid = ostypes.API('objc_msgSend')(c_win, ostypes.HELPER.sel('objectForKey:'), myNSStrings.get('kCGWindowOwnerPID'));
    var int_pid = ostypes.API('objc_msgSend')(rez_pid, ostypes.HELPER.sel('integerValue'));
    thisWin.pid = int_pid;

    // How can I get NSWindow*

}

PS:即使我使用了排除桌面元素标志,我仍然可以获得光标和停靠栏等桌面元素,如果回答者也能阐明如何解决这个问题,那将是非常棒的!

【问题讨论】:

  • 首先,运行代码的应用程序的窗口只能有NSWindows。你到底想做什么?你想在前面订购哪些窗户,为什么?如果您使用的是应用程序自己的窗口,您可以使用 [NSWindow windowNumbersWithOptions:0] 获取 Cocoa 窗口编号,使用 [NSApp windowWithWindowNumber:someWindowNumber] 获取 NSWindow*
  • Aw drats @KenThomases 感谢您一直以来的关注。我在两个不同的插件中有两个需求。 (1) 我创建了一个列出 Windows、Linux/Unix 和 OSX 的所有窗口的东西。然后人们可以选择他们想要保持“始终在顶部”的那个。 (2) 然后在另一个应用程序中,我试图聚焦 PID 的最新窗口,所以我按 z 顺序遍历窗口,第一个出现该 PID 的窗口我想聚焦它。对于第二种情况,我唯一的选择是使用这种方法获取窗口编号然后使用苹果脚本?我没有第一次需要的备用想法:(
  • (3) 我的第三个需要,即我的截图插件,是获取所有窗口的边界,用于事物的“Window Wand”功能,然后使用它然后单击屏幕截图中的一个窗口选择它,我能够很好地处理它。
  • 对于 (2),您可以激活拥有该窗口的应用程序,该应用程序将为其最前面的窗口(或更准确地说,它的关键窗口)提供焦点。您可以使用NSRunningApplication 及其-activateWithOptions: 方法来做到这一点。对于(已弃用的)C 方法,您可以使用SetFrontProcessWithOptions(..., kSetFrontProcessFrontWindowOnly)
  • 这不是我推荐的。你写的是激活你自己的应用程序。我提出了激活另一个应用程序的建议,这就是您的第 2 点。你发现使用[NSRunningApplication runningApplicationWithProcessIdentifier:pid]为目标PID创建一个NSRunningApplication的实例,然后激活它。

标签: objective-c macos core-graphics core-foundation


【解决方案1】:

您应该用来获取窗口 ID 的键是 kCGWindowNumber

并从窗口编号you could use [NSApp windowWithWindowNumber:windowNumber] 中获取 NSWindow。

不幸的是,这仅适用于您的应用拥有的窗口,不适用于其他应用程序窗口。

此外,如果您真的想在获得其他应用程序窗口的窗口 ID 后使用 NSWindow,那么这是一个错误的假设:not all CGWindows are NSWindows。在上述调用之外,Apple 没有提供从 CGWindow 到 NSWindow 的方法。要使用其他应用程序的窗口(前提是其他应用程序是合作的),您必须坚持使用 CGWindow 对象。

【讨论】:

  • 谢谢@Michael。你知道有什么方法可以用 CGWindowID 使窗口“始终位于顶部”吗? :( 碰巧你知道桌面元素是怎么被包含进来的,即使我把它们标记出来了?
  • 您的应用程序/进程拥有的窗口或其他应用程序的窗口?
  • 对于始终处于领先地位的不仅仅是我自己的应用程序,它是任何应用程序。我为 Firefox 制作了一个插件,其中列出了适用于 Windows、Linux/Unix 和 OSX 的所有窗口(不仅仅是我的应用程序/它是 firefox)。在 Windows 和 Linux/Unix 中,他们可以检查标记一个窗口,它会将它设置为始终完美地位于顶部,但 OSX 让我发疯,因为我知道如何在顶部设置的唯一方法是获取 NSWindow 然后将 setLevel 设置为浮动类型。
  • 我很确定您不能更改其他应用程序窗口的窗口级别(这可能是一个安全问题,更不用说越来越多的应用程序在沙盒模式下运行)。
  • Aww drats 大声笑,好的,谢谢,我会继续挖掘,如果我找到任何东西,请告诉你,windows 和 linux 已经完成,除非我给 mac 用户相同的体验,否则我无法发布:(
猜你喜欢
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多