加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何动态控制台应用程序或Windows应用程序

发布时间:2020-12-15 23:23:53 所属栏目:百科 来源:网络整理
导读:我有一个小应用程序,应该以两种模式执行:非UI或 WPF窗口.它应该依赖于命令行参数. 在每种模式中,我都需要显示一些反馈日志: 在WPF窗口模式下,WPF将负责可视化日志, 在无UI模式下,我需要一个控制台来显示日志.如果我的应用程序是从控制台(主要是cmd.exe)启
我有一个小应用程序,应该以两种模式执行:非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文件中定义).

编辑这个错过了关于使用现有控制台的一个要求,一旦我弄清楚如何保持在同一个控制台窗口,我就会编辑它.

New Edit Now可以使用现有的控制台!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读