强制LSUIElement“附件”应用程序到前面

时间:2012-06-22 16:18:54

标签: macos cocoa nswindow

我有一个LSUIElement应用程序需要将其状态保持为LSUIElement(它不能有停靠图标)此应用程序由插件启动和处理。

当我更改应用程序以使其成为“常规”应用程序(没有LSUIElement)时,[NSApp activateIgnoringOtherApps:YES]完美无缺。然而,当我将它设为LSUIElement时,它会显示窗口,但是窗口被卡在safari(插件正在运行的位置)后面,但是在其他所有内容之上。我打电话给-[NSWindow makeKeyAndOrderFront:self];,但这没有任何区别。

要明确“插件”方面是无关紧要的,因为插件和应用程序是两个独立的进程。该插件将一个事件(通过一个马赫端口)发送到应用程序,该应用程序调用一些代码来打开窗口并使其聚焦。问题是使它聚焦的代码只有在它不是LSUIElement应用程序时才有效。

我已经详尽地搜索了一个现有的调用来完成这项工作,我愿意接受关于如何伪造鼠标点击的建议,或者甚至运行一些AppleScript来完成这项工作,也许这是一种没有文档记录的方法。

Apple LSUIElement状态的文档“该应用程序未出现在Dock中,并且没有菜单栏,但可能会以编程方式激活”但我无法找到启用此功能的魔力。

2 个答案:

答案 0 :(得分:0)

以下方法适用于“LSUIElement”设置为“1”的应用,即使整个应用程序使用的是Cocoa:

ProcessSerialNumber psn;
if (noErr == GetCurrentProcess(&psn))
{
    (OSStatus)SetFrontProcess(&psn);
}

(这是Carbon API的一部分。)

答案 1 :(得分:0)

您需要先激活您的应用:

[NSApp activateIgnoringOtherApps:YES];

然后让你的窗口成为关键窗口:

[NSWindow makeKeyAndOrderFront:nil];

这适用于我的项目。