2010-04-14 3 views
2

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

ответ

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

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

+0

Это приложение вашего приложения на передней панели. Почему вы делаете это в основном без цикла событий, я понятия не имею. –

+0

«Приложение» - это 150-строчная программа, которая задает пользователю один вопрос, выполняет несколько простых HTTP-запросов через завиток и, возможно, доставляет короткое сообщение пользователю. На самом деле не нужен полномасштабный графический интерфейс, и я не хочу этого - я бы предпочел сохранить его как можно более кросс-платформенный, все, что мне действительно нужно, эквивалентно Windows MessageBox(). – ZorbaTHut

+0

Неважно, что вы хотите, рамки ожидает цикл событий. Ваша борьба с этим соглашением, скорее всего, будет пустой тратой времени. –

Смежные вопросы