从CGWindowListCopyWindowInfo获取NSWindow*

Noi*_*art 6 macos core-graphics objective-c core-foundation

我已经完成了列出所有窗口(按照从前到后的顺序,我认为/希望)使用,CGWindowListCopyWindowInfo但我有一个问题得到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*

}
Run Code Online (Sandbox Code Playgroud)

PS:即使我使用的是排除桌面元素标志,我仍然可以获得像光标和底座这样的桌面元素,如果回答者有任何机会可以解释如何修复它也会很棒!

Mic*_*ann 6

你应该用来获取窗口ID的关键是kCGWindowNumber.

要从窗口编号获取NSWindow,您可以使用[NSApp windowWithWindowNumber:windowNumber].

不幸的是,这只适用于您的应用拥有的Windows,而不适用于其他应用程序窗口.

此外,如果您真的想在获得其他应用程序窗口的窗口ID后使用NSWindow,那么这是一个不好的假设:并非所有CGWindows都是NSWindows.除了上述调用之外,Apple还没有提供从CGWindow到NSWindow的方法.要使用其他应用程序的窗口(如果其他应用程序是合作的),您将不得不坚持使用CGWindow对象.