FreeConsole与控制台应用程序从cmd.exe框分离

时间:2014-08-13 10:52:07

标签: c# winforms console

我想以这种方式更改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进程中分离进程吗?

1 个答案:

答案 0 :(得分:0)

与同事进行头脑风暴会让我尝试另一种方式。我已将应用程序类型设置回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)并写入它。在没有参数的情况下使用它时,控制台窗口将不会弹出。

我在考虑,有什么更好的方法。让父进程处理stdin,stdout和stderr处理或让应用程序从其父进程中劫持它!?