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 ответ

Решение

Я, кажется, придумал решение, извлеченное из многих связанных с тангенциальным веб-страниц:

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

Я не притворяюсь, что понимаю это - это программирование культового груза во всей красе. Будем весьма благодарны за лучшие ответы или объяснения того, что делает каждый шаг.

Другие вопросы по тегам