使用控制台应用程序从cmd.exe框中分离控制台

本文关键字:控制台 exe 分离 应用程序 cmd | 更新日期: 2023-09-27 18:17:43

我想用这种方式改变一个WinForms应用程序,所以如果用命令行参数调用它,它将在没有UI和控制台输出的情况下运行。因此,我将应用程序类型更改为"控制台应用程序",并编写如下内容:

my code snippet:
    ....
    [DllImport("kernel32.dll")]
    static extern bool FreeConsole();
    [STAThread]
    static void Main(string[] args)
    {            
        if (args.Length == 0)
        {
            FreeConsole();
            Application.Run(new MyForm());  
        }          
        else 
            Console.WriteLine("Console party");
    .....

在VS的调试模式下,我可以看到DOS框弹出和隐藏。如果我通过控制台这样做,命令行将一直连接到进程,并且在我关闭MyForm窗口之前不会响应。使用参数调用应用程序,将启动"控制台方"。

FreeConsole的返回值为true, GetLastError没有告诉任何错误代码。

有人知道如何从cmd.exe进程中分离进程吗?

使用控制台应用程序从cmd.exe框中分离控制台

与同事进行头脑风暴使我尝试另一种方法。我将应用程序类型设置回Windows应用程序,并做了以下操作:

    ...
    [DllImport("kernel32.dll")]
    static extern bool AttachConsole(int input);
    static void Main(string[] args)
    {            
        if (args.Length == 0)
        {   
            Application.Run(new MyForm());
        }
        else if (args.Length == 1)
        {
            AttachConsole(-1);
            Console.WriteLine("Console party");
    ...

现在发生的是,如果我从cmd.exe框中运行它,应用程序将从父进程获取控制台(stdin,stdou,stderr)并向其写入。当不带参数使用它时,控制台窗口将不会弹出。

我在想,什么是更好的方法。让父进程处理标准输入、标准输出和标准错误句柄,还是让应用程序从父进程劫持它!?