Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run();
var sim = new SimMain();
SimInterpreter interpreter;
interpreter.interpreterMain(sim);
Application.Exit();
我正在尝试制作一个以控制台为中心的应用程序,可以选择在输入特定命令时弹出表单。但我无法找到一种方法来通过 Run() 语句,因为应用程序此时冻结了。我需要帮助!
我尝试使用 Run(new SimMain()),但最终它更加强调表单而不是控制台,而且我找不到隐藏它的方法。在 Run() 之前运行控制台移交代码可以让控制台控制应用程序进程,但输入弹出窗口的命令时不会显示表单中的组件。
我用谷歌搜索了多个关键词,但与无形应用相关的文章比沙漠中的水还稀缺。
您需要了解控制台与 UI 程序的工作原理。
在控制台程序中,您有一个用于运行事物的“主”线程。您始终可以控制该线程。当该线程退出主方法时,您的控制台程序将终止。
在 UI 程序中,有一个“UI 线程”。您无法像控制台程序那样直接控制该线程。相反,它将运行一个“消息泵/循环”来处理来自操作系统的事件。这本质上是一个处理来自队列的消息的无限循环。因此,如果您单击按钮,操作系统将会发送一条“鼠标按下”消息。 UI 代码将找出您单击的按钮,并引发相应的按钮事件处理程序。从那里您可以做任何您需要做的事情。但您需要将控制权返回给消息泵。否则将显示“应用程序已挂起”消息。
调用
Application.Run()
将启动这样的消息泵,但实际上不显示任何形式。因此“冻结应用程序”是预期的行为。
如果您需要控制台部分与 UI 部分同时工作,我将创建一个新线程,并使用
ShowDialog()
在该线程上显示您的表单。这也将启动消息泵,并使这个新线程成为“UI 线程”。但你需要非常小心才能使其正常工作。
仅当您确实熟悉多线程和线程安全时,我才会推荐此方法。否则,我建议要么制作一个 UI 要么 一个控制台应用程序,或者在启动时决定它会是什么。根据您的具体用例的详细信息,可能还有其他解决方案。