从控制台打开WPF应用程序,然后关闭控制台窗口

时间:2019-03-09 17:25:59

标签: c# wpf console-application

我有一个具有控制台或WPF功能的混合应用程序。 WPF应用程序是启动还是在控制台窗口中完成操作取决于启动时的参数。我能够实现这一点(在stackoverflow上有很多示例可以找到)。现在我想要,如果启动了WPF应用程序,则控制台窗口将关闭。但这显示了,如果我关闭它,WPF应用程序也会关闭。

这是我目前的实现方式。

using System;
using System.Windows;

namespace MyNamespace
{

    class Program
    {

        [STAThread]
        static void Main(string[] args)
        {
            string option = args[0];

            switch (option)
            {
                case "WPF":
                    RunApplication();

                    break;
                default:
                    DoSomething();

                    break;
            }
        }

        private static void RunApplication()
        {
            Application app = new Application();
            app.Run(new MainWindow());

            Environment.Exit(0);
        }

        private static void DoSomething()
        {
            // …
        }
    }
}

如果我尝试在新的Thread中启动应用程序,则会直接关闭该应用程序,并且不会显示WPF窗口。

using System.Threading;
using System.Threading.Tasks;

private static void RunApplication()
{
    new Thread(() => {
        Application app = new Application();
        app.Run(new MainWindow());
    }).Start();

    Environment.Exit(0);
}

我不知道该如何实现。有可能这样做吗?

2 个答案:

答案 0 :(得分:0)

我可以找到解决方案。根据本文Show/Hide the console window of a C# console application的公认答案,我隐藏了控制台窗口。

using System;
using System.Runtime.InteropServices;
using System.Windows;

namespace DeploymentPreparer
{

    class Program
    {

        [STAThread]
        static void Main(string[] args)
        {
            string option = args[0];

            switch (option)
            {
                case "WPF":
                    RunApplication();

                    break;
                default:
                    DoSomething();

                    break;
            }
        }

        private static void RunApplication()
        {
            ShowWindow(GetConsoleWindow(), SW_HIDE);
            Application app = new Application();
            app.Run(new MainWindow());
        }

        private static void DoSomething()
        {
            // ...
        }

        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        const int SW_HIDE = 0;
        const int SW_SHOW = 5;
    }
}

现在我有了控制台或WPF窗口。如果显示了WPF窗口,则控制台窗口被隐藏。

答案 1 :(得分:0)

我尝试了以下似乎可行的方法: 创建一个普通的控制台应用程序。如果使用“ WPF”参数,则将WPF应用程序作为新进程启动。如果有其他参数,请致电DoSomething()

示例:

using System;
using System.Diagnostics;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string option = "";
            if (args.Length > 0)
            {
                option = args[0];
            }

            switch (option)
            {
                case "WPF":

                    try
                    {
                        using (Process myProcess = new Process())
                        {
                            myProcess.StartInfo.UseShellExecute = false;

                            // Use correct path to the WPF Application
                            myProcess.StartInfo.FileName = @"C:\Users\Danny\Source\Repo\WpfApp\bin\Debug\WpfApp.exe";
                            myProcess.Start();
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                        Console.WriteLine("Press any key to continue ...");
                        Console.ReadKey();
                    }

                    break;
                default:
                    DoSomething();

                    break;
            }
        }

        private static void DoSomething()
        {
            // …
            Console.WriteLine("Doing Something ...");
            Console.WriteLine("Press any key to continue ...");
            Console.ReadKey();
        }
    }
}