【问题标题】:FreeConsole to detach from cmd.exe box with Console ApplicationFreeConsole 使用控制台应用程序从 cmd.exe 框中分离
【发布时间】:2014-08-13 20:20:30
【问题描述】:

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

【问题讨论】:

  • 这是一个被问了一遍又一遍的问题。唯一可靠的方法是拥有两个版本的流程。针对 GUI 和控制台子系统的版本。有关规范示例,请参见 python.exe 和 pythonw.exe 或 java.exe 和 javaw.exe。

标签: c# winforms console


【解决方案1】:

与同事的头脑风暴让我尝试了另一种方式。我已将应用程序类型设置回 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 句柄,还是让应用程序从其父进程中劫持它!?

【讨论】:

  • 当父进程关闭并且您已附加到其控制台时会发生什么,您的进程也已关闭。并不总是你想要的。更重要的是,因为您的进程是 GUI 子系统,所以当您从 cmd 启动它时,cmd 知道它是一个 GUI 进程并执行通常在该场景中发生的事情,即启动它,然后继续期待接收输入。那么,这两个进程中的哪一个将处理标准输入上的输入?这里的底线是你必须在编译时决定你的程序是 GUI 还是控制台。
  • 我也是这么想的。它以 GUI 处理方式解释了为什么不发布控制台。环顾四周,我发现这在 Win98 之前是可能的,但对于当前的行为来说更有意义。
  • 你会在这里找到无数关于 SO 试图做你正在做的事情的问题,但答案总是一样的!
  • 当然,是否有两个可执行文件对我的生活并不重要。对我来说,背后发生的事情很有趣。感谢您的帮助。
  • stackoverflow.com/a/494000/288393 - rob kennedy 雄辩地解释了选项是什么 - 底线,要么接受控制台窗口的闪烁,要么有两个可执行文件(一个用于 ui,一个用于控制台)。跨度>
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2013-07-13
相关资源
最近更新 更多