Pergunta

Estou tentando montar um pacote de relatórios de erro simples. Se meu programa principal travar, ele salva um Crashlog e inicia um programa repórter. O programa repórter pergunta ao usuário se ele pode enviar o log de falhas para mim, o faz. Estou usando o nsrunalertPanel para criar uma caixa de mensagem básica.

Por alguma razão, essa caixa de mensagens está aparecendo enterrada sob qualquer outra janela que possa estar aberta. Execute o pacote principal de uma janela do localizador, ele aparece no topo, force -o a travar, a janela do repórter aparece atras do a janela do localizador.

Por que isso está acontecendo e como pode ser resolvido?

Caso de teste mínimo:

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

Construído com:

g++ test.mm -framework AppKit && ./a.out
Foi útil?

Solução

Parece que tenho uma solução, destilada de muitas páginas da web tangencialmente relacionadas:

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

Não pretendo entender isso - é a programação de culto de carga no seu melhor. Melhores respostas, ou explicações do que cada etapa faz, seriam muito apreciadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top