如果你这样调用TransformProcessType():
ProcessSerialNumber psn = { 0, kCurrentProcess };
(void) TransformProcessType(&psn, kProcessTransformToForegroundApplication);
然后cocoa应用程序菜单不显示,除非你在应用程序中尽早调用它(例如在applicationWillFinishLaunching中)。
答案 0 :(得分:8)
我向Apple寻求帮助,他们帮助我很好。引用:
调用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];
}
答案 1 :(得分:2)
以下是我如何使其发挥作用。
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);
}