我想在WPF项目中实现命令行运行.App.c中的入口点已更改.但控制台只会闪烁然后消失.如何解决?谢谢
public class App : System.Windows.Application
{
[STAThread]
static void Main(string[] args)
{
if (args.Length > 0)
{// Commandline run mode
// Command line given, console from console
Console.WriteLine("In cmd line mode");
AllocConsole();
CmdLineRun.ParseArgs(args);
CmdLineRun.CmdRun();
}
else
{// GUI mode
GUIMain();
}
}
static void GUIMain()
{
App app = new App();
app.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
app.Run();
}
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();
}
Run Code Online (Sandbox Code Playgroud)
当您创建一个新的控制台窗口时,AllocConsole它只会在您的进程仍处于活动状态时粘在一起.为了防止这种情况,您有几个选择:
在用户提供一些输入之前,不要实际终止您的进程.这是您的陈词滥调"按任意键继续"选项,您将在CmdRun返回方法后执行此操作.控制台窗口仍然会消失,但只有当你说出来时.
使用预先存在的控制台.如果始终从命令行运行应用程序,则无需创建新的控制台窗口.相反,使用该AttachConsole方法将stdin/stdout附加到已存在的stdin/stdout.
最好的选择通常是首先尝试AttachConsole(-1)(-1表示ATTACH_PARENT_PROCESS).如果返回0,那么您的父进程没有控制台,否则您无法附加到它.然后你可以重新开始AllocConsole,并在关闭后处理它.
这不是WPF特有的,只要您尝试在同一个应用程序中混合使用控制台和GUI代码,这就是一个问题.如果您的应用程序是为CUI子系统编译的,通过指定"控制台应用程序",Windows将为您处理此问题,但默认情况下您不会获得消息队列,并且窗口UI将失败.如果您的应用程序是为GUI子系统编译的,则通过指定"Windows应用程序",您将获得一个消息队列,但不会获得控制台处理.让Windows处理GUI部分并手动管理控制台是两个选项中更容易的选择.
| 归档时间: |
|
| 查看次数: |
1719 次 |
| 最近记录: |