我正在尝试创建一个WPF - 混合应用程序。此应用程序应该具有从命令提示符启动的选项,在这种情况下,它不会显示任何窗口,但只会启动某个进程然后退出。
例如,在我的WPF应用程序中(我做了示例)我允许用户创建将发送给任何用户(某种模板)的电子邮件正文。 之后当用户想要发送电子邮件时,他可以通过cmd来完成,如下所示(意味着GUI甚至不会启动,它只会调用电子邮件连接器并向选定的收件人发送邮件然后退出程序):
MyProgram.exe -recipient john@doe.com -send=true
My Main()看起来像这样(基于以下网站创建:http://www.jankowskimichal.pl/en/2011/12/wpf-hybrid-application-with-parameters/)
public static class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AllocConsole();
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool FreeConsole();
[DllImport("kernel32", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
[STAThreadAttribute]
[System.Diagnostics.DebuggerNonUserCodeAttribute]
public static void Main(string[] args)
{
//App.Main();
if (args.Length == 0)
{
IP_DynamicMailings.App app = new IP_DynamicMailings.App();
app.InitializeComponent();
app.Run();
}
else
{
// Get uppermost window process
IntPtr ptr = GetForegroundWindow();
int u;
GetWindowThreadProcessId(ptr, out u);
Process process = Process.GetProcessById(u);
// Check if it is console?
if (process.ProcessName == "cmd")
{
// Yes – attach to active console
AttachConsole(process.Id);
}
else
{
// No – create new console
AllocConsole();
}
// Program actions ...
foreach (var item in args)
{
Console.WriteLine(item);
}
FreeConsole();
}
}
}
我需要按Enter才能退出应用程序。 我也愿意重写我的混合逻辑,你有没有更好的解决方案(这是我能找到的最好的解决方案)。