是否可以设置NSTask拥有的窗口前端和键?

时间:2012-01-26 22:36:41

标签: objective-c cocoa nstask

我正在开发一款Mac应用程序,它可以选择安装一些苹果包格式的额外软件。这个软件包需要提升(root)权限才能安装,而不是使用帮助工具或AuthorizationExecuteWithPrivileges(),我觉得使用NSTask更容易调用/usr/bin/open甚至/System/Library/CoreServices/Installer.app/Contents/MacOS/Installer包的路径,让它处理用户授权。

因此,它可以正常工作,但是安装程序窗口不会出现在堆栈的前面,也不会出现密钥。在启动任务之前,我可以orderOut调用窗口,这有助于排序,但关键是,确实是关键。

我应该继续实施Apple的BetterAuthorizationSample,因为我可能不得不在将来的某个时候使用它,并且因为它会成为一个更好的人尝试过吗?

2 个答案:

答案 0 :(得分:2)

有两个变量决定了哪个窗口是关键。其中之一是应用程序中的一个设置,用于确定哪个窗口处于焦点,另一个是哪个应用程序处于活动状态。在我们自己的应用程序中隐藏窗口将使安装程序可见,但除非您使安装程序应用程序处于活动状态,否则它不会成为密钥。你有几个选择。

首先,您可以使用以下命令停用您的应用程序:

[[NSApplication sharedApplication] deactivate];

接下来,您可以找到安装程序的NSRunningApplication并将其激活:

NSArray *apps = [[NSWorkspace sharedWorkspace] runningApplications];
NSRunningApplication *app = // find installer
[app activateWithOptions:0];

但在您的情况下,我建议您使用NSWorkspace为您打开安装程序,而不是通过NSTask启动它。 NSWorkspace将自动停用您的应用程序,因此您无需获得有关文件是否成功打开的反馈,并自动选择打开它的应用程序。

BOOL success = [[NSWorkspace sharedWorkspace] openFile:@"path/to/file.pkg"];

答案 1 :(得分:0)

您可以通过在applicationDidFinishLaunching处理程序中包含以下代码来强制将进程置于前面的代码中:

ProcessSerialNumber process;
GetCurrentProcess(&process);
SetFrontProcess(&process);

这将使它成为最重要的过程,无论其他什么。但是,您需要链接到Carbon。