C# 当前进程是否有控制台窗口
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表示已经有控制台窗口、创建失败。
作者:唐宋元明清2188
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。