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);