簡體   English   中英

從控制台打開WPF應用程序,然后關閉控制台窗口

[英]Open WPF application from console and close console window

我有一個具有控制台或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);
}

我不知道如何實現這一目標。 有可能這樣做嗎?

我可以找到解決方案。 根據本文的公認答案, 顯示/隱藏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窗口,則控制台窗口被隱藏。

我嘗試了以下似乎可行的方法:創建一個普通的控制台應用程序。 如果使用“ 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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM