NSRunAlertPanel отображается за «активным окном» - PullRequest
2 голосов
/ 14 апреля 2010

Я пытаюсь собрать простой пакет сообщений об ошибках. Если моя основная программа дает сбой, она сохраняет журнал сбоев, а затем запускает программу-репортер. Программа-репортер спрашивает пользователя, может ли она отправить мне журнал сбоев, а затем делает это. Я использую 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 Ответ

2 голосов
/ 14 апреля 2010

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

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

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

...