调用TransformProcessType()时,应用程序菜单不会显示

Fat*_*tso 5 macos cocoa macos-carbon

如果你像这样调用TransformProcessType():

ProcessSerialNumber psn = { 0, kCurrentProcess }; 
(void) TransformProcessType(&psn, kProcessTransformToForegroundApplication);
Run Code Online (Sandbox Code Playgroud)

然后cocoa应用程序菜单不显示,除非你在应用程序中尽早调用它(例如在applicationWillFinishLaunching中).

Fat*_*tso 9

我向Apple寻求帮助,他们帮助我很好.Quote:

调用TransformProcessType时未显示菜单栏的原因是您的应用程序已经是活动应用程序(即[[NSRunningApplication currentApplication] isActive]返回YES)并且应用程序的菜单栏会在应用程序显示时显示活性

这是他们的解决方法:

- (void)transformStep1 {
    for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"]) {
        [app activateWithOptions:NSApplicationActivateIgnoringOtherApps];
        break;
    }
    [self performSelector:@selector(transformStep2) withObject:nil afterDelay:0.1];
}

- (void)transformStep2
{
    ProcessSerialNumber psn = { 0, kCurrentProcess }; 
    (void) TransformProcessType(&psn, kProcessTransformToForegroundApplication);

    [self performSelector:@selector(transformStep3) withObject:nil afterDelay:0.1];
}

- (void)transformStep3
{
    [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps];
}
Run Code Online (Sandbox Code Playgroud)

  • 我用过@"com.apple.dock".这似乎比激活Finder更好,导致它跳转到前台. (3认同)