Question

Je suis en train de mettre en place un simple paquet de rapports d'erreurs. Si mes principaux plantages du programme, il enregistre un crashlog, puis commence un programme rapporteur. Le programme rapporteur demande à l'utilisateur si elle peut me envoyer le journal accident, ne puis donc. J'utilise NSRunAlertPanel pour créer une boîte de message de base.

Pour une raison quelconque, cette boîte de message affiche pas enterré sous toutes les autres fenêtres qui peuvent être ouvertes. Exécutez le package principal à partir d'une fenêtre du Finder, il apparaît sur le dessus, le forcer à tomber en panne, la fenêtre reporter apparaît derrière la fenêtre du Finder.

Pourquoi est-ce qui se passe, et comment peut-il être résolu?

Minimal cas de test:

#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
Était-ce utile?

La solution

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

#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 - c'est la programmation de culte du cargo à son meilleur. De meilleures réponses, ou des explications sur ce que chaque étape fait, serait grandement apprécié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top