[英]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.