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

所属分类: 软件编程 / C#教程 阅读数: 91
收藏 0 赞 0 分享

需求
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 键;

更多精彩内容其他人还在看

C# SendInput 模拟鼠标操作的实现方法

C# SendInput 模拟鼠标操作的实现方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中 paint()与Onpaint()的区别

paint是事件onpaint方法onpaint方法是调用paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的:
收藏 0 赞 0 分享

c#中GetType()与Typeof()的区别

c#中GetType()与Typeof()的区别,需要的朋友可以参考一下
收藏 0 赞 0 分享

将字符串转换成System.Drawing.Color类型的方法

将字符串转换成System.Drawing.Color类型的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C# 抓取网页内容的方法

C# 抓取网页内容的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

基于C#后台调用跨域MVC服务及带Cookie验证的实现

本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下
收藏 0 赞 0 分享

使用C#获取远程图片 Form用户名与密码Authorization认证的实现

本篇文章介绍了,使用C#获取远程图片 Form用户名与密码Authorization认证的实现。需要的朋友参考下
收藏 0 赞 0 分享

Winform跨线程操作的简单方法

线程间操作无效:从不是创建控件“label1”的线程访问它
收藏 0 赞 0 分享

C# WINFORM 强制让窗体获得焦点的方法代码

C# WINFORM 强制让窗体获得焦点的方法代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中方括号[]的语法及作用介绍

C#中方括号[]可用于数组,索引、属性,更重要的是用于外部DLL类库的引用。
收藏 0 赞 0 分享
查看更多