在Winform动态启动、控制台命令行的方法

时间:2021-11-02 05:11:07 

需求
winForm 程序输出类型为 windows 程序(不是命令行程序)
在运行时想输入一些信息编译开发调试,如何实现这一功能

解答:

AllocConsole、FreeConsole 这两个 API 可以在任何时候调用和关闭 命令行。

代码演示:
API 部分


using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class NativeMethods
    {
        /// <summary>
        /// 启动控制台
        /// </summary>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        public static extern bool AllocConsole();
        /// <summary>
        /// 释放控制台
        /// </summary>
        /// <returns></returns>
        [DllImport("kernel32.dll")]
        public static extern bool FreeConsole();
    }
}

启动参数的实现


using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                if (args.Length > 0 && args[0].ToLower() == "-c")
                {//通过命令行 xxxx.exe -c 参数启动,Console

                    //注意:不用 Main(string[] args)、System.Environment.GetCommandLineArgs();  也可以取得命令行参数在任何地方

                    //启动
                    NativeMethods.AllocConsole();
                    Console.WriteLine("控制台以启动");
                }

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            finally
            {
                //关闭 (如果在这个位置其实写不写都行了)
                NativeMethods.FreeConsole();
            }
        }
    }
}

程序实现


using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnOpenConsole_Click(object sender, EventArgs e)
        {
            //开启控制台
            NativeMethods.AllocConsole();
        }

        private void btnCloseConsole_Click(object sender, EventArgs e)
        {
            //关闭控制台
            NativeMethods.FreeConsole();
        }

        private void btnOut_Click(object sender, EventArgs e)
        {
            //模拟输出
            Console.WriteLine(textBox1.Text);
        }
    }
}

代码下载:(VS2008 如果其他版本VS请自行修改)
http://xiazai.jb51.net/201302/other/WinformShellConsole_VS08.rar

最后:

其实代码很简单,不过很适合在运行时输出一些临时调试信息
用GUI画图的操作一般下断点很容易影响Print 事件的情况
,有时候在客户那里程序问题在上打开控制台输出一些调试信息看着比较方便;
而且控制太没有线程限制的,所以使用起来要比单独的日志窗口方便、而且容易复制内容,还支持 paus 键;

标签:Winform,动态启动,控制台命令行
0
投稿

猜你喜欢

  • Spring boot整合log4j2过程解析

    2023-11-29 10:47:53
  • C#操作目录与文件的方法步骤

    2023-11-23 20:45:52
  • 详细解读C++编程中的匿名类类型和位域

    2023-11-02 23:08:18
  • 深入浅析Android消息机制

    2023-07-26 03:20:02
  • Spring如何解决单例bean线程不安全的问题

    2023-12-18 23:50:20
  • springboot多环境配置文件及自定义配置文件路径详解

    2021-09-30 03:55:54
  • C# 删除字符串中的中文(实例分享)

    2021-12-30 12:55:48
  • idea 多模块项目依赖父工程class找不到问题的方法

    2022-06-08 10:47:41
  • Spring 代理 Bean 获取不到原始 Bean 对象注解解决方法

    2022-10-31 17:06:08
  • Java8中的 Lambda表达式教程

    2023-10-13 01:32:29
  • Kotlin基础教程之Run,标签Label,函数Function-Type

    2022-08-28 14:11:01
  • maven工程中jar包瘦身的五种方法

    2023-11-04 05:01:54
  • Java 添加、替换、删除PDF中的图片的示例代码

    2023-08-28 09:06:26
  • Java剑指offer之删除链表的节点

    2023-05-19 15:30:27
  • Java中的CAS和ABA问题说明

    2021-08-19 11:08:18
  • 一次由Lombok的@AllArgsConstructor注解引发的错误及解决

    2023-10-07 05:23:42
  • java Swing基础教程之图形化实例代码

    2023-06-30 03:15:20
  • Java线程池ThreadPoolExecutor源码深入分析

    2023-11-09 19:49:36
  • java8新特性之日期时间API

    2023-06-20 09:15:50
  • 解决Android Studio xml 格式化不自动换行的问题

    2021-09-10 06:15:42
  • asp之家 软件编程 m.aspxhome.com