2010-04-14 9 views
2

J'essaye de mettre en place un paquet de rapport d'erreur simple. Si mon programme principal tombe en panne, il enregistre un crashlog, puis démarre un programme de journaliste. Le programme de journaliste demande à l'utilisateur s'il peut m'envoyer le journal de panne, puis il le fait. J'utilise NSRunAlertPanel pour créer une boîte de message de base.NSRunAlertPanel apparaît derrière la "fenêtre active"

Pour quelque raison que ce soit, cette boîte de message apparaît enfouie sous toutes les autres fenêtres qui peuvent être ouvertes. Exécuter le paquet principal à partir d'une fenêtre du Finder, il apparaît sur le dessus, le forcer à planter, la fenêtre du journaliste apparaît derrière la fenêtre du Finder. Pourquoi cela se produit-il et comment peut-il être résolu?

cas de test minimal:

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

Construit avec:

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

Répondre

2

Il me semble avoir trouver une solution, distillée à partir de nombreuses pages Web tangentiellement connexes:

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

Je ne prétends pas comprendre cela - c'est la programmation culte de la cargaison à son meilleur. De meilleures réponses, ou des explications sur ce que fait chaque étape, seraient grandement appréciées.

+0

Il porte votre candidature au premier plan. Pourquoi vous faites cela en main sans boucle d'événement, je n'en ai aucune idée. –

+0

L '"application" est un programme de 150 lignes permettant de poser à l'utilisateur une seule question, de faire quelques requêtes HTTP simples via curl, et éventuellement de délivrer un court message à l'utilisateur. Il n'a pas vraiment besoin d'une interface graphique à grande échelle, et je n'en ai pas besoin - je préfère le garder aussi multiplate-forme que possible, tout ce dont j'ai vraiment besoin est un équivalent de Windows MessageBox(). – ZorbaTHut

+0

Peu importe ce que vous voulez, le framework attend une boucle d'événement. Votre lutte contre cette convention sera plus que probablement une perte de temps complète. –

Questions connexes