2010-04-14 67 views
2

我正在嘗試放置一個簡單的錯誤報告包。如果我的主程序崩潰,它會保存一個crashlog,然後啓動一個記者程序。記者程序詢問用戶是否可以向我發送崩潰日誌,然後這樣做。我使用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

它將您的應用程序帶到前臺。爲什麼你這樣做主要沒有事件循環,我不知道。 – 2010-04-14 18:42:32

+0

「應用程序」是一個150行程序,用於詢問用戶單個問題,通過curl執行一些簡單的HTTP請求,並可能向用戶發送簡短消息。它並不是真的需要全面的GUI,我也不需要一個 - 我寧願將它保持爲跨平臺,我真正需要的是與Windows MessageBox()的等效。 – ZorbaTHut 2010-04-14 19:30:24

+0

你想要什麼並不重要,框架需要一個事件循環。你與這個公約的鬥爭很可能是完全浪費時間。 – 2010-04-15 05:59:33