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表示已经有控制台窗口、创建失败。

 

posted @ 2023-03-30 17:58  唐宋元明清2188  阅读(272)  评论(0编辑  收藏  举报