C#:同一应用程序中的 WPF 和命令行

标签 c# wpf command-line-interface

我有一个工作的 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();
        }
    }
}

应用程序.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 调用隐藏此控制台窗口 here但它仍然会非常短暂地弹出。

作为一个好处,您不必再使用 AttachConsole/AllocConsole/FreeConsole 附加到控制台,因为您已经在控制台中了。如果将 this.Shutdown(); 替换为 Environment.Exit(0 );

关于C#:同一应用程序中的 WPF 和命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40171101/

相关文章:

c# - 如何从 C# 应用程序打印标签卷?

c# - 分布式领导者选举算法的可视化模拟器

c# - 完全模态 WPF 窗口?

bash - sed 或 grep 在一组括号之间读取

git - 如何使用 cli 获取当前分支的 Github 最新提交 url

c# - 已编译的 lambda 表达式用作属性 getter 和 setter : wrong benchmarking method or wrong lambda expression construction?

c# - SQL Server CLR 集成未按预期调用系统时间

c# - wpf中的多列自动搜索用户控件

wpf - {Binding PropertyName} 和 {Binding Path=PropertyName} 之间的区别

linux - 在 CLI 程序之间通过管道传输输出时出现缓冲问题