Winforms在Main中打开控制台而不关闭表单?

时间:2013-11-26 20:53:28

标签: c# winforms console

我在C#中创建了一个使用表单和控制台的应用程序,在Program.cs的Main()中调用:

[STAThread]
static void Main(string[] args)
{
  if (Form1.compile == 0)
        {
            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            Application.Run(new Form1());

        }

        if (Form1.compile == 1)
        {
            Form1.compile = 0;
            int u;

            IntPtr ptr = GetForegroundWindow();

            GetWindowThreadProcessId(ptr, out u);

            Process process = Process.GetProcessById(u);
            AllocConsole();

            //a lot of code for the command prompt
        }
}

启动应用程序时,它首先启动Form1。然后当Form1关闭时,它只会加载命令提示符和我输入的所有代码。

我的问题是,如何通过按Form1中的按钮来运行第二部分(当编译== 1时)?它是否可能,因为Main()函数只在start时调用,而Application.Start(Program.Main())给出错误?

按钮:

private void button1_Click(object sender, EventArgs e)
    {
       this.Close();  // Any way to open the console part without closing the form?         
     //this.Hide();
       compile = 1;
    }

注意:我尝试在控制台之后调用Form1,但我也想在按下按钮时更新控制台,但这并不会发生。

编辑:对于未来的读者,解决方案只是将所有内容放在mainform(或其他类)而不是Main()中,因为它没有自我更新,因此在启动后无法执行任何操作。

3 个答案:

答案 0 :(得分:0)

只需按照以下方式执行此操作,而无需触及main()。

        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        private static extern bool AllocConsole();

        private void button1_Click(object sender, EventArgs e)
        {
            AllocConsole();
            this.Hide();
            // Just call the console related methods in here
        }

答案 1 :(得分:0)

您应该简单地从您的Main方法中提取用于处理控制台的代码。创建一个新类,负责在程序中创建/操作控制台,并将Form1.compile == 1内的代码复制到该类中。然后在Main中调用该类,如果它应该创建一个控制台,或者从按钮单击事件调用它,如果那是你想要创建然后操作控制台的时候。

答案 2 :(得分:0)

好的,让我试着解释实际发生的事情。

Main方法按顺序执行,就像您期望的那样。它执行一个命令,然后执行下一个等等。但是,只要你调用Application.Run,​​就会启动一个消息循环 - 基本上是一个大的while (true) { ... }。只要表格打开,这种情况就会持续下去。因此,如果您希望在表单打开时完成某些操作,请不要将其放在Application.Run调用之后,只需将其放在按钮的Click事件处理程序中即可。

现在,我想您希望能够在按下按钮时打开控制台,但即使按钮没有按下

也是如此。

最简单的方法是为您的控制台创建一个帮助程序类:

public static class ConsoleHelper
{
  static bool isCreated;

  [System.Runtime.InteropServices.DllImport("kernel32.dll")]
  private static extern bool AllocConsole();

  public static void PrepareConsole()
  {
    if (isCreated) return;

    AllocConsole();
    isCreated = true;
  }
}

现在,按下按钮即可调用ConsoleHelper.PrepareConsole()。

但是,如果你没有按下按钮,显然不会创建控制台。您可以从Main函数中删除控制台初始化代码,只需在Form的Closing事件处理程序中调用ConsoleHelper.PrepareConsole()。这样,您应该在表单中以及关闭表单后按需控制台。

如果这不是你想要的,你可能需要更好地解释自己,因为显然,有足够的歧义来得到三个不能回答你问题的答案:D