我在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()中,因为它没有自我更新,因此在启动后无法执行任何操作。答案 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