C#hybird Winforms / console app返回cmd提示符

时间:2012-04-05 03:42:37

标签: c#

我见过很多关于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");

1 个答案:

答案 0 :(得分:6)

FWIW,我也尝试了第一种方法。我最后只是使用:

隐藏控制台窗口
IntPtr handle = GetConsoleWindow();
if (handle != IntPtr.Zero)
{
    ShowWindow(handle, 0);  // 0=SW_HIDE
}

这甚至可以从任务栏完全隐藏窗口。它闪烁了一小段时间但在我的情况下这是可以接受的