Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 调用TransformProcessType()时,应用程序菜单不显示';我没有出现_Macos_Cocoa_Macos Carbon - Fatal编程技术网

Macos 调用TransformProcessType()时,应用程序菜单不显示';我没有出现

Macos 调用TransformProcessType()时,应用程序菜单不显示';我没有出现,macos,cocoa,macos-carbon,Macos,Cocoa,Macos Carbon,如果像这样调用TransformProcessType(): ProcessSerialNumber psn = { 0, kCurrentProcess }; (void) TransformProcessType(&psn, kProcessTransformToForegroundApplication); 然后,除非你在应用程序中提前调用cocoa应用程序菜单(例如,在applicationWillFinishLaunching中),否则不会显示cocoa应用程序菜单。我向苹

如果像这样调用TransformProcessType():

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

然后,除非你在应用程序中提前调用cocoa应用程序菜单(例如,在applicationWillFinishLaunching中),否则不会显示cocoa应用程序菜单。

我向苹果寻求帮助,他们帮了我很大的忙。引述:

调用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];
}

下面是我如何让它工作的

BOOL MakeAppForeground()
{
    BOOL bSuccess = TranformAppToState(kProcessTransformToForegroundApplication);

    if(bSuccess)
    {
         bSuccess = (SetSystemUIMode(kUIModeNormal, 0) == 0);
        [NSApp activateIgnoringOtherApps:YES];
    }

    return bSuccess;
}

BOOL MakeAppBackground()
{
    return TranformAppToState(kProcessTransformToBackgroundApplication);
}

BOOL TranformAppToState(ProcessApplicationTransformState newState)
{
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    OSStatus transformStatus = TransformProcessType(&psn, newState);

    if((transformStatus != 0))
    {
        NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:transformStatus userInfo:nil];
        NSLog(@"TranformAppToState: Unable to transform App state. Error - %@",error);
    }

    return (transformStatus == 0);
}

我得到了答案,但因为我的声誉太低,我只能在8小时内回答。我会尝试添加评论。我向苹果寻求帮助,他们帮了我很大的忙。Quote:>调用TransformProcessType时菜单栏不显示的原因是您的应用程序已经是活动应用程序(即,[[NSRunningApplication currentApplication]isActive]返回YES]),并且应用程序的菜单栏在激活应用程序时显示这是他们的解决方法:-(void)transformStep1{for(NSRunningApplication*app在[NSRunningApplication runningApplicationsWithBundleIdentifier:@“com.apple.finder”]{[app activatedethodoptions:nsapplicationactivatedignoringotherapps];break;}[selector:@selector(transformStep2)with object:nil afterDelay:0.1];}-(void)transformStep2{ProcessSerialNumber psn={0,kCurrentProcess};(void)TransformProcessType(&psn,kProcessTransformToForegroundApplication);[self-performSelector:@selector(transformStep3)with Object:nil afterDelay:0.1];}-(void)transformStep3{[[nsrunning Application currentApplication]ActivateWithoOptions:NSApplicationActivateIgnoringOtherApps];}我使用了@“com.apple.dock”。这似乎比激活Finder使其跳转到前台要好。