C# 控制台-没有控制台但有 winforms 的应用程序
C# Console-Application with no console but winforms
我们有一个 WinForms 应用程序。它接受启动参数并且可以使用命令行执行某些没有UI的工作。
现在,我们还需要一些控制台输出,例如使用 application.exe /help
。
我们现在面临的问题是:如何以一种“美好”的方式将两个世界结合在一起:
将输出类型设置为“Windows 应用程序”时,所有 UI 都可以正常工作,但 Console.WriteLine()
使用时不显示结果命令.
当将输出类型设置为“控制台”时,通常这两种方法都有效,但是:应用程序(可以说是在 UI-模式下使用时)会引发一个控制台 window,在应用程序终止之前一直保持打开状态。
有没有办法绕过控制台的可见性-window?
在现实世界中,我可以使用以下三种方法之一找到应用程序 - 但我都不喜欢其中任何一种:
在 UI 模式下 运行 时让控制台 window 打开,谁在乎?
使用user32.dll
隐藏window(它仍然闪烁,不过)
从命令行使用时,使用 Windows-Application 作为输出类型并将控制台输出显示为“消息框”。
我找到了解决办法,感谢@Luaan 的评论:
我现在正在使用输出类型 Windows 应用程序(因此,没有控制台 window)- 但只需将控制台注册到应用程序“父”控制台即可。
现在的行为符合预期:
正常启动期间不显示控制台。
在现有控制台 window (ps / cmd) 中使用时,会打印输出,因为从技术上讲,控制台就是 parent-console申请。
public class GUIConsoleWriter
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AttachConsole(int dwProcessId);
private const int ATTACH_PARENT_PROCESS = -1;
public static void RegisterGUIConsoleWriter()
{
AttachConsole(ATTACH_PARENT_PROCESS);
}
}
然后,Main()
中的第一行:
static void Main(String[] args)
{
GUIConsoleWriter.RegisterGUIConsoleWriter();
}
现在,使用常规 Console.WriteLine()
就可以了。 Ofc。这仅限于编写输出,但对于我的项目范围来说已经足够了,因为输入必须带有参数,没有交互式 console-options.
当另一个应用程序需要以编程方式获取输出时,您可以。不能 myApp.exe /doSomething
但需要 cmd /C myApp.exe /doSomething
因为应用程序本身没有控制台。
并且您必须在提供输出后手动注意“退出”您的应用程序,否则该过程将不会 return。
我们有一个 WinForms 应用程序。它接受启动参数并且可以使用命令行执行某些没有UI的工作。
现在,我们还需要一些控制台输出,例如使用 application.exe /help
。
我们现在面临的问题是:如何以一种“美好”的方式将两个世界结合在一起:
将输出类型设置为“Windows 应用程序”时,所有 UI 都可以正常工作,但
Console.WriteLine()
使用时不显示结果命令.当将输出类型设置为“控制台”时,通常这两种方法都有效,但是:应用程序(可以说是在 UI-模式下使用时)会引发一个控制台 window,在应用程序终止之前一直保持打开状态。
有没有办法绕过控制台的可见性-window?
在现实世界中,我可以使用以下三种方法之一找到应用程序 - 但我都不喜欢其中任何一种:
在 UI 模式下 运行 时让控制台 window 打开,谁在乎?
使用
user32.dll
隐藏window(它仍然闪烁,不过)从命令行使用时,使用 Windows-Application 作为输出类型并将控制台输出显示为“消息框”。
我找到了解决办法,感谢@Luaan 的评论:
我现在正在使用输出类型 Windows 应用程序(因此,没有控制台 window)- 但只需将控制台注册到应用程序“父”控制台即可。
现在的行为符合预期:
正常启动期间不显示控制台。
在现有控制台 window (ps / cmd) 中使用时,会打印输出,因为从技术上讲,控制台就是 parent-console申请。
public class GUIConsoleWriter { [System.Runtime.InteropServices.DllImport("kernel32.dll")] private static extern bool AttachConsole(int dwProcessId); private const int ATTACH_PARENT_PROCESS = -1; public static void RegisterGUIConsoleWriter() { AttachConsole(ATTACH_PARENT_PROCESS); } }
然后,Main()
中的第一行:
static void Main(String[] args)
{
GUIConsoleWriter.RegisterGUIConsoleWriter();
}
现在,使用常规 Console.WriteLine()
就可以了。 Ofc。这仅限于编写输出,但对于我的项目范围来说已经足够了,因为输入必须带有参数,没有交互式 console-options.
当另一个应用程序需要以编程方式获取输出时,您可以。不能 myApp.exe /doSomething
但需要 cmd /C myApp.exe /doSomething
因为应用程序本身没有控制台。
并且您必须在提供输出后手动注意“退出”您的应用程序,否则该过程将不会 return。