FreeConsole() 不分离进程
FreeConsole() does not detach the process
我已经读过 但那个问题中接受的解决方案对我不起作用。
我有一个 WinForm 应用程序(称为 FormPlusConsoleApp
),如果调用程序传递了一些参数,它可以用作控制台应用程序。
我需要向控制台提供来自程序 FormPlusConsoleApp
的状态消息,因此,我在程序的最开始附加到控制台。
问题: 执行所需的作业后,程序应以退出代码 0/1 退出,并且应在没有任何用户交互的情况下完全分离到控制台。
我已经按照 中的建议调用了 FreeConsole()
方法,但最后,命令提示符上出现了一个闪烁的光标(如屏幕截图所示)并且用户必须按一个按钮才能完全退出。
示例工作程序:
using System;
using System.Windows.Forms;
using System.IO;
namespace FormPlusConsoleApp
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
System.Windows.Forms.MessageBox.Show("Attach the debugger now...");
if (args.Length == 0) //form version
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormApp());
}
else //start console version
{
// case args.Length > 0
SampleConsoleExecution();
}
}
static void SampleConsoleExecution()
{
//attach to the console
bool isAttached = AttachConsole(-1);
//Sample Message
Console.WriteLine(Environment.NewLine + "Console process started...");
//do something
Console.WriteLine(Environment.NewLine + "Exit process!");
//Free console
FreeConsole(); //<<<<<<<<<--------blinking cursor appears on the console but the user still have to press the "ENTER" button
}
//To attach to the console (parent)
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AttachConsole(int dwProcessId);
//To free from the attached console
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
static extern bool FreeConsole();
}
}
PS: 我知道最好的方法是使用相同业务逻辑的独立 WinForm 和控制台应用程序。不幸的是,这不是我的选择。上面的代码只是MWE为了测试问题。
正如这篇 blog post by Raymond Chen and this answer 中所写,您不能拥有一个既是控制台又是 windows 应用程序的应用程序。
解决方法很少,对我有用的方法是在主函数的末尾添加以下代码:
SendKeys.SendWait("{ENTER}");
要设置退出代码,您可以使用 Environment.Exit:
Environment.Exit(0);
我已经读过
我有一个 WinForm 应用程序(称为 FormPlusConsoleApp
),如果调用程序传递了一些参数,它可以用作控制台应用程序。
我需要向控制台提供来自程序 FormPlusConsoleApp
的状态消息,因此,我在程序的最开始附加到控制台。
问题: 执行所需的作业后,程序应以退出代码 0/1 退出,并且应在没有任何用户交互的情况下完全分离到控制台。
我已经按照 FreeConsole()
方法,但最后,命令提示符上出现了一个闪烁的光标(如屏幕截图所示)并且用户必须按一个按钮才能完全退出。
示例工作程序:
using System;
using System.Windows.Forms;
using System.IO;
namespace FormPlusConsoleApp
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
System.Windows.Forms.MessageBox.Show("Attach the debugger now...");
if (args.Length == 0) //form version
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormApp());
}
else //start console version
{
// case args.Length > 0
SampleConsoleExecution();
}
}
static void SampleConsoleExecution()
{
//attach to the console
bool isAttached = AttachConsole(-1);
//Sample Message
Console.WriteLine(Environment.NewLine + "Console process started...");
//do something
Console.WriteLine(Environment.NewLine + "Exit process!");
//Free console
FreeConsole(); //<<<<<<<<<--------blinking cursor appears on the console but the user still have to press the "ENTER" button
}
//To attach to the console (parent)
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AttachConsole(int dwProcessId);
//To free from the attached console
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
static extern bool FreeConsole();
}
}
PS: 我知道最好的方法是使用相同业务逻辑的独立 WinForm 和控制台应用程序。不幸的是,这不是我的选择。上面的代码只是MWE为了测试问题。
正如这篇 blog post by Raymond Chen and this answer 中所写,您不能拥有一个既是控制台又是 windows 应用程序的应用程序。
解决方法很少,对我有用的方法是在主函数的末尾添加以下代码:
SendKeys.SendWait("{ENTER}");
要设置退出代码,您可以使用 Environment.Exit:
Environment.Exit(0);