首页 > 系统相关 >C# 当前进程是否有控制台窗口

C# 当前进程是否有控制台窗口

时间:2023-04-01 12:02:02浏览次数:31  
标签:输出 窗口 C# 应用程序 consoleWindowHandle Debug 控制台

WPF应用程序,在VS的项目属性中,可以设置输出类型:

C# 当前进程是否有控制台窗口_应用程序

那我们在代码中,如何判断应用的类型呢。有没有控制台?是否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:

C# 当前进程是否有控制台窗口_应用程序_02

注:这里输出到VS控制台,是因为使用了Debug类型。如果是Console.Write,程序会优先输出到控制台窗口内。

 

如果需要在Windows应用程序下,使用控制台窗口输出日志。可以使用AllocConsole:

[DllImport("kernel32.dll")]
    static extern bool AllocConsole();

AllocConsole,可以创建控制台窗口。bool返回值,true表示之前没有控制台窗口、创建成功,false表示已经有控制台窗口、创建失败。

 

作者:唐宋元明清2188


标签:输出,窗口,C#,应用程序,consoleWindowHandle,Debug,控制台
From: https://blog.51cto.com/u_13906430/6163466

相关文章

  • Angular Generating browser application bundles (phase: setup)...An unhandled ex
    PSF:\WorkGitHub\angulard3tree>ngserve⠋Generatingbrowserapplicationbundles(phase:setup)...Anunhandledexceptionoccurred:webpack_1.AngularWebpackPluginisnotaconstructorSee"C:\Users\ghosii\AppData\Local\Temp\ng-daZXzA\angu......
  • java reflection exception--can not access a member of class XXX with modifiers "
    Ifyoutrytovisitthevalueofanobject'sprivatefieldusingreflection,suchasField#getorField#set,youshouldcallField#setAccessibleahead.lookatthesampleprogrambelow.ItworkswhenIrunit.Field[]fields=ref......
  • 【Azure 应用服务】Function App / App Service 连接 Blob 报错
    问题描述因Blob启用了防火墙功能,但是当把AppService或FunctionApp的出站IP地址都加入到Blob的白名单中,为什么访问还是403错误呢? 问题解答AzureStorage的IP网络规则不适用于同一数据中心的客户端。存储帐户部署在同一区域中的服务使用专用的AzureIP地址进行通信。因此,不......
  • 第二十二篇 vue - 深入组件 - 异步组件 - defineAsyncComponent
    基本用法defineAsyncComponent在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件。Vue提供了defineAsyncComponent方法来实现此功能import{defineAsyncComponent}from'vue'constAsyncComp=defineAsyncComponent(()=>{returnn......
  • 第二十八篇 vue - 深入组件 - 动态组件 - component
    component动态组件就是动态变化的组件,和动态样式一样,通过用户的操作来确定是什么类型的组件。动态样式是绑定:style,动态组件则是绑定:is在vue中,实现Tab切换主要有三种方式:使用动态组件,使用vue-router路由,使用第三方插件。本文将详细介绍Vue动态组件所谓动态组件就是让多......
  • c++ socket编程之服务端编写
    开头想要写一个带界面、功能全面、传输高效、运行稳定的马儿,能够在生产环境下工作在cursor的帮助下,用一天时间完成了服务端和客户端的编写另外一天时间卡在了中文消息传输处理和大文件传输粘包、分包问题上功能收发消息,支持中文消息发送命令执行并显示命令执行结果任意......
  • 第二十一篇 vue - 深入组件 - 依赖注入 - provide 和 inject
    Prop逐级透传问题provide和inject可以帮助我们解决这一问题。[1]一个父组件相对于其所有的后代组件,会作为依赖提供者任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖Prop逐级透传问题通常情况下,当我们需要从父组件向子组件传递数据时,会使用pr......
  • C# Task异步编程
    1.   在C#中,Task是一种用于异步编程的重要概念。它代表了一个异步操作的单元,可以在后台执行一个操作并返回结果。具体来说,Task包含了如下几个重要的概念:异步操作:Task可以用来表示一个异步操作,例如异步下载网页内容、异步读取文件等。线程池:Task会将异步操作放到线程池中执......
  • ChatGPT相关
    搭建网站:参考:https://www.cnblogs.com/smartloli/p/17274947.html参考:https://www.cnblogs.com/stulzq/p/17271937.html......
  • 在 Debian 11 安装 GCC
     步骤1.在我们安装任何软件之前,通过apt在终端中运行以下命令来确保您的系统是最新的很重要:sudoaptupdatesudoaptupgradesudoaptinstallbuild-essential步骤2.在Debian11上安装GCC。默认情况下,GCC在Debian基础存储库中可用,并且可以使用APT包管理器轻......