WPF應用程序,在VS的項目屬性中,可以設置輸出類型:
那我們在代碼中,如何判斷應用的類型呢。有沒有控制檯?是否Windows應用程序還是控制檯應用程序?
Kernel32下函數GetConsoleWindow可以解決這個問題:
[DllImport("kernel32.dll")]
private static extern IntPtr GetConsoleWindow();
1 var consoleWindowHandle = GetConsoleWindow(); 2 if (consoleWindowHandle == IntPtr.Zero) 3 { 4 Debug.WriteLine("輸出類型爲 Windows應用程序"); 5 } 6 else 7 { 8 Debug.WriteLine("輸出類型爲 控制檯應用程序"); 9 }
另外,如果需要判斷控制檯應用程序內,主窗口是否爲控制檯,可以根據窗口句柄來確認:
1 var consoleWindowHandle = GetConsoleWindow(); 2 var mainWindowHandle = Process.GetCurrentProcess().MainWindowHandle; 3 4 if (consoleWindowHandle == IntPtr.Zero) 5 { 6 Debug.WriteLine("輸出類型爲 Windows應用程序"); 7 } 8 else if (consoleWindowHandle == mainWindowHandle) 9 { 10 Debug.WriteLine("輸出類型爲 控制檯應用程序,主窗口也是控制檯窗口"); 11 } 12 else 13 { 14 Debug.WriteLine("輸出類型爲 控制檯應用程序,但主窗口爲Windows窗口"); 15 }
我們設置輸出類型爲控制檯應用,並在ShowMainWindow前後,輸出結果,驗證okay:
注:這裏輸出到VS控制檯,是因爲使用了Debug類型。如果是Console.Write,程序會優先輸出到控制檯窗口內。
如果需要在Windows應用程序下,使用控制檯窗口輸出日誌。可以使用AllocConsole:
[DllImport("kernel32.dll")] static extern bool AllocConsole();
AllocConsole,可以創建控制檯窗口。bool返回值,true表示之前沒有控制檯窗口、創建成功,false表示已經有控制檯窗口、創建失敗。