c#: WPF和命令行在同一个应用程序
本文关键字:同一个 应用程序 命令行 WPF | 更新日期: 2023-09-27 18:14:22
我有一个工作的WPF应用程序,我想为它配备一些控制台功能来启用批处理。为此,我从App.xaml中删除了StartupUri="MainWindow.xaml"
,并添加了一个基于命令行参数的编程调用,调用WPF或控制台应用程序。这很好,只是有一个问题,控制台应用程序中的第一个Console.WriteLine()
也在命令行中输出二进制路径。
还有什么需要我更改的吗?
App.xaml.cs:
using System;
using System.Linq;
using System.Windows;
using System.Windows.Forms;
namespace AppNamespace
{
public partial class App : System.Windows.Application
{
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AllocConsole();
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool FreeConsole();
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern bool AttachConsole(int pid);
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if (e.Args.Contains("/c"))
{
// try to attach to an parent process console
if (!AttachConsole(-1))
{
// Alloc a new console
AllocConsole();
}
Console.WriteLine("Line 1");
Console.WriteLine("Line 2");
// get command prompt back
SendKeys.SendWait("{ENTER}");
// detach console
FreeConsole();
}
else
{
new MainWindow().ShowDialog();
}
this.Shutdown();
}
}
}
App.xaml:
<Application x:Class="AppNamespace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Application.Resources>
</Application.Resources>
</Application>
命令行输出:
C:'TestProject'bin'Debug>testapp.exe /c
C:'TestProject'bin'Debug>Line 1
Line 2
C:'TestProject'bin'Debug>
命令行输出:
C:'TestProject'bin'Debug>testapp.exe /c
Line 1
Line 2
C:'TestProject'bin'Debug>
如果您在项目属性中将应用程序的输出类型从Windows应用程序更改为控制台应用程序,则可以在控制台中实现此行为。
缺点是,如果您直接启动WPF应用程序,您将获得一个新的控制台窗口。你可以用这里提到的Win32调用隐藏这个控制台窗口,但它仍然会很短地弹出。
作为一个好处,你不必再使用AttachConsole/AllocConsole/FreeConsole
连接到控制台,因为你已经在一个控制台。如果您将this.Shutdown();
替换为Environment.Exit(0);
,您也可以摆脱SendKeys.SendWait("{ENTER}");
。
这是因为您的应用程序是Windows应用程序,而不是真正的控制台应用程序。当您从控制台中启动Windows应用程序时,它不会等待应用程序退出,因此它只是在控制台中再次显示提示。我不认为一款应用同时是控制台和Windows应用。