【发布时间】: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