Откройте приложение WPF из консоли и закройте окно консоли. - PullRequest
1 голос
/ 09 марта 2019

У меня есть гибридное приложение с функциями консоли или 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 голосов
/ 10 марта 2019

Я попробовал следующий метод, который, кажется, работает: Создайте обычное консольное приложение.В случае аргумента «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();
        }
    }
}
0 голосов
/ 09 марта 2019

Я мог бы найти решение. Согласно принятому ответу на этот пост Показать / Скрыть окно консоли консольного приложения C # Я скрываю окно консоли.

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, окно консоли скрыто.

...