我见过很多关于C#的混合gui / cli应用程序的例子。我已经实现了这样的应用程序,但是我很难弄清楚如何在命令行上运行时阻止.exe,而不是立即返回到提示符。
//defines for commandline output
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
private const int ATTACH_PARENT_PROCESS = -1;
[STAThreadAttribute]
static void Main(string[] args)
{
// load cli
// redirect console output to parent process;
// must be before any calls to Console.WriteLine()
AttachConsole(ATTACH_PARENT_PROCESS);
if (args.Length == 0)
{
//loads gui
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new form_Main());
}
else
{
cli_main cli = new cli_main();
cli.start_cli(args);
Console.WriteLine("finished");
System.Windows.Forms.SendKeys.SendWait("{ENTER}");
Application.Exit();
}
}
我得到以下输出
C:\Users\john\Documents\Visual Studio 2010\Projects\test\test\test\bin\Debug>test.exe -param1 test
-param2 test2
C:\Users\john\Documents\Visual Studio 2010\Projects\test\test\test\bin\Debug>Output was successful. File saved as: c:\test\test.html
finished
“完成”这一行是我输出的一个字符串,当我知道我已经到达主代码的末尾...这在Winforms中工作正常,我的项目是Winforms,我把它作为一个gui开始但现在我正在尝试使它成为杂交gui / cli
它似乎正在运行我的主要代码和线程,我在调试中看到它们,它创建了我的最终输出文件......
我很困惑如何在从cmd行执行时使用它的参数保留.exe,不返回命令提示符?让它等待一个闪烁的光标,然后输出关于html文件的行然后行“完成”,然后最后返回到命令提示符。
我尝试了很多东西,比如删除
System.Windows.Forms.SendKeys.SendWait("{ENTER}");
Application.Exit();
而不是使用Application.Exit();
使用Environment.Exit(0);
,但它总是立即返回到命令提示符,我也尝试在行之后进入睡眠状态5秒
cli.start_cli(args);
但这也不起作用,我想我不明白它如何能立即返回命令提示符,它甚至没有行
Console.WriteLine("finished");
答案 0 :(得分:6)
FWIW,我也尝试了第一种方法。我最后只是使用:
隐藏控制台窗口IntPtr handle = GetConsoleWindow();
if (handle != IntPtr.Zero)
{
ShowWindow(handle, 0); // 0=SW_HIDE
}
这甚至可以从任务栏完全隐藏窗口。它闪烁了一小段时间但在我的情况下这是可以接受的