NSRunAlertPanel出现在“活动窗口”后面

时间:2010-04-14 17:12:36

标签: cocoa dialog messagebox foreground nsrunalertpanel

我正在尝试整理一个简单的错误报告包。如果我的主程序崩溃,它会保存一个崩溃日志,然后启动一个记者程序。记者程序询问用户是否可以将崩溃日志发送给我,然后这样做。我正在使用NSRunAlertPanel创建一个基本的消息框。

出于某种原因,该消息框显示在任何其他可能打开的窗口下面。从Finder窗口运行主程序包,它显示在顶部,强制它崩溃,报告窗口显示 Finder窗口后面。

为什么会发生这种情况,如何解决?

最小测试用例:

#import <AppKit/AppKit.h>

int main(int a, char* av) {
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  NSApplication* q = [[NSApplication alloc] init]; 
  NSRunAlertPanel(@"Hello", @"Aloha", @"OK", nil,nil);
  [pool release];
} 

内置:

g++ test.mm -framework AppKit && ./a.out

1 个答案:

答案 0 :(得分:2)

我似乎已经提出了一个解决方案,从许多与切向相关的网页中提炼出来:

#import <AppKit/AppKit.h>

int main(int a, char* av) {
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  NSApplication* q = [[NSApplication alloc] init]; 

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

  [NSApp activateIgnoringOtherApps:YES];

  NSRunAlertPanel(@"Hello", @"Aloha", @"OK", nil,nil);
  [pool release];
} 

我不会假装理解这一点 - 它是最好的货物崇拜节目。我们将非常感谢您提供更好的答案或解释每个步骤的内容。