0

我有一个用于 MAC 的 NPAPI 插件,可以从服务器下载并运行应用程序。

当我使用 NSTask 打开应用程序时。该应用程序没有出现在前面。

NSBundle *bundle = [NSBundle bundleWithPath:AppPath];
NSString *path = [bundle executablePath];
NSTask *task = [[NSTask alloc] init];
NSArray *arguments;
arguments = [NSArray arrayWithObjects:AppParam,nil];

[task setLaunchPath:path];
[task setArguments:arguments];
[task launch];

我搜索了解决方案并想出了代码

int pid  = [task processIdentifier];
ProcessSerialNumber psn;
GetProcessForPID(pid, &psn);
SetFrontProcess(&psn);

但是这段代码没有把应用程序带到前面然后我尝试了下面的代码。

NSRunningApplication *runapp = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
[runapp activateWithOptions:0];

这没有产生预期的结果。

经过一番搜索,我发现了一些建议使用 NSWorkspace 来启动和激活应用程序的帖子。我想出了代码。

[workspace
    launchApplicationAtURL:[bundle bundleURL]
    options:NSWorkspaceLaunchNewInstance
    configuration:[NSDictionary
        dictionaryWithObject:arguments
        forKey:NSWorkspaceLaunchConfigurationArguments]
    error:error];

这一切正常,但不是在一种情况下。当应用程序通过 NSworkspace 命令第一次下载并执行时,MAC 会提示一个对话框“是从 Internet 下载的应用程序。您确定要打开它吗”。

如果按下确定,应用程序会启动但不会出现在最前面。此对话框仅在应用程序通过 NSWorkspace 启动时出现。使用 NSTask 启动,MAC 在执行前不会提示对话框。

找不到解决问题的解决方案。我对 NSWorkspace 的确认对话框很满意,但是任何人都可以提出一些在单击“确定”后仍会将应用程序带到前面的建议。

我也试过用。

[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
[[NSWorkspace sharedWorkspace] activeApplication];

对此的任何帮助将不胜感激。提前致谢。

问候,

懒人编码器 7.

4

2 回答 2

2

xattr如果您想绕过对话框从而避免它产生的焦点问题,您可以在启动应用程序之前手动剥离隔离标志。

(这个问题实际上与 NPAPI 无关;您在独立应用程序中执行此操作时会有完全相同的行为集。)

于 2013-02-20T11:45:04.447 回答
0

通常,您可能不应该绕过隔离标志。需要这样做通常表明设计不佳。

NSWorkspace 将以用户级权限运行。NSTask 可以设置它的环境,即使它默认为父进程的环境。

于 2013-02-20T13:52:02.227 回答