gpt4 book ai didi

c# - 如何动态地成为控制台应用程序或 Windows 应用程序

转载 作者:行者123 更新时间:2023-12-04 23:45:27 29 4
gpt4 key购买 nike

我有一个小应用程序应该在 中执行两种模式 : 非 UI 或 WPF 窗口。它应该取决于命令行参数。

在每种模式下,我都需要显示一些反馈日志:

  • 在 WPF 窗口模式下,WPF 将负责可视化日志,
  • 在无 UI 模式下,我需要一个控制台来显示日志。如果我的应用程序是从控制台(主要是 cmd.exe)启动的,我想在不打开新应用程序的情况下使用它。如果我的应用程序是在控制台之外启动的(双击资源管理器、CreateProcess 等),我需要创建一个新的控制台来输出我的结果并等待 Readkey 将其关闭。

  • 我已经找到:
  • 我如何创建一个新的控制台:
    How to open/close console window dynamically from a wpf application? ,
  • 如何获取当前控制台窗口句柄以显示/隐藏它:
    Show/Hide the console window of a C# console application

  • 而且我知道我可以在项目属性中静态选择“Windows 应用程序”或“控制台应用程序”。

    选择“Windows 应用程序”,GetConsoleWindow() 始终为 0,我不知道如何重用以前的控制台。

    选择“控制台应用程序”,我可以重用以前的控制台,但是在 WPF 窗口模式下从资源管理器启动时,在我的 WPF 主窗口下创建了一个控制台。

    问题是: 应用程序如何才能真正具有动态性? 在 WPF 窗口模式下,只有一个 WPF 窗口(根本没有控制台)或在非 UI 中,只有一个控制台(启动一个或一个新创建的一个)。

    最佳答案

    在 Winforms 中要容易得多,但也不太难。

    从 WPF 应用程序项目(不是带有 WPF 窗口的控制台应用程序项目)开始。

    在根目录新建一个Program.cs类,添加如下代码:

    class Program
    {
    [DllImport("Kernel32")]
    public static extern void AllocConsole();

    [DllImport("Kernel32")]
    public static extern void FreeConsole();

    [DllImport("kernel32.dll")]
    static extern bool AttachConsole(uint dwProcessId);

    [STAThread]
    public static void Main(string[] args)
    {
    bool madeConsole = false;
    if (args.Length > 0 && args[0] == "console")
    {

    if (!AttachToConsole())
    {
    AllocConsole();
    Console.WriteLine("Had to create a console");
    madeConsole = true;
    }

    Console.WriteLine("Now I'm a console app!");
    Console.WriteLine("Press any key to exit");
    Console.ReadKey(true);

    if (madeConsole)
    FreeConsole();
    }
    else
    {
    WpfApplication1.App.Main();
    }
    }


    public static bool AttachToConsole()
    {
    const uint ParentProcess = 0xFFFFFFFF;
    if (!AttachConsole(ParentProcess))
    return false;

    Console.Clear();
    Console.WriteLine("Attached to console!");
    return true;
    }

    }

    现在你有一个控制台应用程序或 WPF 应用程序。在属性中,将启动对象设置为 Program.Main方法。在上面的示例中,WpfApplication1.App.Main 是旧的启动对象(在 App.xaml.cs 文件中定义)。

    编辑 这遗漏了您关于使用现有控制台的一项要求,一旦我弄清楚如何留在同一个控制台窗口中,我就会对其进行编辑。

    新编辑 现在可以使用现有的控制台!

    关于c# - 如何动态地成为控制台应用程序或 Windows 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29947305/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com