[STAThread]
void Main(string[] args])
{
Application.EnableVisualStyles();
//Do some stuff...
while(!Exit)
{
Application.DoEvents(); //Now if you call "form.Show()" your form won´t be frozen
//Do your stuff
}
}
2)如果你从一个控制台启动它,并显示一个 GUI,控制台将被阻塞,直到 GUI 退出。这是因为控制台(cmd.exe)认为它应该同步启动控制台应用程序和 Windows 应用程序(Unix 版本的“ myprocess &”)。
如果将输出类型保留为 Windows Application,但 正确调用 AttachConsole,则从控制台调用时不会获得第二个控制台窗口,从 Explorer 调用时也不会获得不必要的控制台。调用 AttachConsole 的正确方法是向其传递 -1。这会导致我们的进程附加到父进程的控制台(启动我们的控制台窗口)。
然而,这有两个不同的问题:
1)由于控制台在后台启动 Windows 应用程序,它会立即显示提示并允许进一步输入。一方面,这是一个好消息,控制台在 GUI 应用程序上没有被阻塞,但是如果你想把输出转储到控制台而不显示 GUI,你的程序的输出在提示符之后,当你完成时没有显示新的提示符。这看起来有点令人困惑,更不用说您的“控制台应用程序”是在后台运行的,并且用户在运行时可以自由地执行其他命令。
2)流重定向也会出现混乱,例如“ myapp 有些参数 > some file”无法重定向。流重定向问题需要大量的 p/Invoke 来修复标准句柄,但是这是可以解决的。
Form form = new Form();
Form.Button.Text = "randomText";
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.Run(form);
例如 int Left { get; set; } // need to specify the LEFT position of the button on the Form
然后在 Main()中添加以下代码片段:
static void Main(string[] args)
{
Application.EnableVisualStyles();
Form frm = new Form(); // create aForm object
Button btn = new Button()
{
Left = 120,
Width = 130,
Height = 30,
Top = 150,
Text = "Biju Joseph, Redmond, WA"
};
//… more code
frm.Controls.Add(btn); // add button to the Form
// …. add more code here as needed
frm.ShowDialog(); // a modal dialog
}