Search code examples
macoscocoamacos-carbon

When calling TransformProcessType(), the app menu doesn't show up


If you call TransformProcessType() like this :

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

Then the cocoa app menu doesn't show up unless you call this early enough in your app (eg. in applicationWillFinishLaunching).


Solution

  • I asked Apple for help and they helped me very well. Quote :

    The reason why the menu bar isn't show when you call TransformProcessType is that your app is already the active app (that is, [[NSRunningApplication currentApplication] isActive] returns YES) and the menu bar for an app is shown when the app is activated

    This is their workaround :

    - (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];
    }