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>

c#: WPF和命令行在同一个应用程序

如果您在项目属性中将应用程序的输出类型从Windows应用程序更改为控制台应用程序,则可以在控制台中实现此行为。

缺点是,如果您直接启动WPF应用程序,您将获得一个新的控制台窗口。你可以用这里提到的Win32调用隐藏这个控制台窗口,但它仍然会很短地弹出。

作为一个好处,你不必再使用AttachConsole/AllocConsole/FreeConsole连接到控制台,因为你已经在一个控制台。如果您将this.Shutdown();替换为Environment.Exit(0);,您也可以摆脱SendKeys.SendWait("{ENTER}");

这是因为您的应用程序是Windows应用程序,而不是真正的控制台应用程序。当您从控制台中启动Windows应用程序时,它不会等待应用程序退出,因此它只是在控制台中再次显示提示。我不认为一款应用同时是控制台和Windows应用。

相关文章: