从 CGWindowListCopyWindowInfo 获取 NSWindow*

Get NSWindow* from CGWindowListCopyWindowInfo

我已经使用 CGWindowListCopyWindowInfo 列出了所有 windows(按 z 顺序从前到后 think/hope),但我在获取 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:即使我正在使用排除桌面元素标志,我仍然会得到桌面元素,如光标和停靠栏,如果回答者也能阐明如何解决这个问题,那将是太棒了!

您应该用来获取 window ID 的密钥是 kCGWindowNumber

并从 window 号码获取 NSWindow,you could use [NSApp windowWithWindowNumber:windowNumber]

遗憾的是,这仅适用于您的应用程序拥有的 windows,不适用于其他应用程序 windows。

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