C# C hybird Winforms/console应用程序返回cmd提示符
我已经看到了许多用于C的混合gui/cli应用程序的示例。我已经实现了这样一个应用程序,但是我很难弄清楚如何防止.exe在命令行上运行时不能立即返回提示符C# C hybird Winforms/console应用程序返回cmd提示符,c#,C#,我已经看到了许多用于C的混合gui/cli应用程序的示例。我已经实现了这样一个应用程序,但是我很难弄清楚如何防止.exe在命令行上运行时不能立即返回提示符 //defines for commandline output [DllImport("kernel32.dll")] static extern bool AttachConsole(int dwProcessId); private const int ATTACH_PARENT_PROCESS
//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.Exit0;但它总是立即返回到命令提示符,我还尝试在行结束后休眠5秒
cli.start_cli(args);
但这也不起作用,我想我不明白它怎么能立即返回到命令提示符,而且它甚至都不在命令行中
Console.WriteLine("finished");
FWIW,我也尝试了第一种方法。我最终只是使用以下方法隐藏控制台窗口:
IntPtr handle = GetConsoleWindow();
if (handle != IntPtr.Zero)
{
ShowWindow(handle, 0); // 0=SW_HIDE
}
这将完全隐藏窗口,甚至从任务栏也可以。它闪烁了一小秒,但这在我的情况下是可以接受的。FWIW,我也尝试了第一种方法。我最终只是使用以下方法隐藏控制台窗口:
IntPtr handle = GetConsoleWindow();
if (handle != IntPtr.Zero)
{
ShowWindow(handle, 0); // 0=SW_HIDE
}
这将完全隐藏窗口,甚至从任务栏也可以。它闪烁了一小秒,但这在我的情况下是可以接受的我只是放弃了尝试创建混合CLI和GUI.exe,如果我将项目保留为winform,我会遇到上面的问题,如果我将其保留为console应用程序,那么我会弹出一个cmd窗口,我有一个解决方法,但仍然会在第二秒弹出。所以我只使用了2.exe,1代表gui,1代表cli,然后创建了一个.dll库来在2之间共享主代码。我只是放弃了尝试创建一个混合cli和gui.exe,如果我将项目保留为winform,我得到了上面的问题,如果我将其保留为console应用程序,那么我会弹出一个cmd窗口,我有一个解决办法,但仍然会弹出秒。因此,我只使用了2.exe,1代表gui,1代表cli,然后创建了一个.dll库来在2之间共享主代码。