我有一个具有控制台或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);
}
我不知道该如何实现。有可能这样做吗?
答案 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();
}
}
}