防止应用程序在关闭控制台时退出

5

我使用 AllocConsole() 在winform应用程序中打开控制台。

我该如何防止应用程序在关闭控制台时退出?

编辑

我想要在控制台中显示时间到时间的更新完成百分比。

    void bkpDBFull_PercentComplete(object sender, PercentCompleteEventArgs e)
    {
        AllocConsole();
        Console.Clear();
        Console.WriteLine("Percent completed: {0}%.", e.Percent);
    }

我尝试使用richTextBox作为替代方案。

       s =(e.Percent.ToString());
       richTextBox1.Clear();
       richTextBox1.AppendText("Percent completed:  " +s +"%");

但我无法看到完成百分比实时更新,只有当它达到100%时才会显示。

有其他替代方法吗?


是的,控制台上的X按钮。 - Bags Banny
你不能停止或禁用它。你可以使用SetConsoleCtrlHandler()获得通知,但ExitProcess()调用始终在其后执行。如果你承受不起,请不要使用控制台。 - Hans Passant
@HansPassant 如果在处理控制台关闭事件后,OP调用FreeConsole以将WinForm应用程序与控制台分离,这是否可能?或者会先调用ExitProcess? - keyboardP
1
不是之后,必须在回调函数中完成。我不知道那是否可行,应该有人试试:) 可能性不大,你会期望 Windows 增加句柄的引用计数。 - Hans Passant
什么是最好的替代方案? - Bags Banny
显示剩余3条评论
3个回答

1

我知道这不是经常出现的任务,但我遇到了类似的情况,决定使用一些技巧来解决。

http://social.msdn.microsoft.com/Forums/vstudio/en-US/545f1768-8038-4f7a-9177-060913d6872f/disable-close-button-in-console-application-in-c

-禁用自定义控制台应用程序上的“关闭”按钮。
-您的文本框解决方案也应该有效。听起来很像您正在从主线程调用一个函数,这个函数正在占用也在主线程上的窗体,当更新文本框时会导致问题。考虑创建一个新线程并使用事件处理程序来更新文本框,或者使用新线程中的invoke方法invoker来更新文本框。下面是一个已经回答过的问题的链接,可以了解如何完成此操作。
-如何从另一个线程更新主线程中的文本框?
public class MainForm : Form {
    public MainForm() {
        Test t = new Test();

        Thread testThread = new Thread((ThreadStart)delegate { t.HelloWorld(this); });
        testThread.IsBackground = true;
        testThread.Start();
    }

    public void UpdateTextBox(string text) {
        Invoke((MethodInvoker)delegate {
            textBox1.AppendText(text + "\r\n");
        });
    }
}

public class Test {
    public void HelloWorld(MainForm form) {
        form.UpdateTextBox("Hello World"); 
    }
}

0

你可以先构建一个控制台应用程序,接收参数并将其写入控制台。将它放在主应用程序启动的位置。 从主应用程序中,你可以先终止进程,然后使用新的参数重新打开它。
这是另一种方法。


0

请参考这里的答案。正如答案中所提到的,无法阻止应用程序关闭

但是作为一种解决方法,您可以使用答案中描述的自己的文本输出解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接