启动.NET控制台应用程序时会发生什么?

时间:2010-09-24 09:04:47

标签: .net unicode replace cmd console-application

.NET控制台应用程序启动时到底发生了什么?

在进程资源管理器中,启动exe时我想知道为什么我看不到“cmd.exe”进程作为控制台应用程序的父进程。究竟是什么显示出来?

有没有办法用另一个替换“默认”控制台窗口?我想这意味着修改“控制台子系统”。

创建GUI应用程序而不是控制台应用程序不是一种选择,因为我没有所有可能工具的来源。

观察:

  • 使用Mono和Linux,我对此和我的测试应用程序没有任何问题!
  • 使用的字体有影响,我找不到适合所有东西的字体(即使安装了亚洲包装)
  • HKEY_CURRENT_USER\Console的注册表中调整(更改字体,大小,...)正在产生影响,可以根据可执行文件进行定义。

2 个答案:

答案 0 :(得分:3)

  

在进程资源管理器中,启动exe时我想知道为什么我看不到“cmd.exe”进程作为控制台应用程序的父进程。究竟是什么显示出来?

您不需要cmd.exe拥有控制台窗口,任何具有正确标头标记的可执行文件都将导致Windows为其创建控制台,或者如果其父级具有父级进程,则连接到其父进程的控制台窗口之一。

  

有没有办法用另一个替换“默认”控制台窗口?

仅限:

  • 将应用程序的编译器标志更改为GUI应用程序,然后使用Win32 API AllocConsole创建控制台。 (如果您无法重建可执行文件,则包含完整性,不适用于此处。) 1
  • 创建不是控制台应用程序的中间程序(因此不与其父控制台关联),然后启动程序。
  • 创建 控制台应用程序的中间程序(因此与其父控制台无关),然后启动程序并将CREATE_NEW_CONSOLE标记传递给CreateProcess。< SUP> 2

1 Editbin.exe可以更改标记(editbin /subsystem:WINDOWS),但应用程序需要调用AllocConsole

2 目前尚不清楚CreateNoWindowProcessStartInfo属性是否在.NET中为Process.Start提供相同的功能。如果确实如此,那么这个中介可以用.NET编写,但是本机解决方案的重量会相当轻 - 在这样一个不得不加载.NET的短程序中,这会显着减慢速度。

答案 1 :(得分:2)

尝试设置Console.OutputEncoding属性。

Console.OutputEncoding = Encoding.UTF8;

这将有效地调用Win32本机SetConsoleOutputCP function将控制台代码页设置为指定编码的CodePage属性。