【问题标题】:Show message in current cmd by c#c#在当前cmd中显示消息
【发布时间】:2012-09-07 07:38:56
【问题描述】:

我已经编写了可以在控制台和用户界面中运行的应用程序。现在从控制台执行应用程序时,我想在当前打开的控制台中显示消息。

static class Program
    {
        [DllImport("kernel32.dll",
            EntryPoint = "GetStdHandle",
            SetLastError = true,
            CharSet = CharSet.Auto,
            CallingConvention = CallingConvention.StdCall)]
        private static extern IntPtr GetStdHandle(int nStdHandle);
        [DllImport("kernel32.dll",
            EntryPoint = "AllocConsole",
            SetLastError = true,
            CharSet = CharSet.Auto,
            CallingConvention = CallingConvention.StdCall)]
        private static extern int AllocConsole();
        private const int STD_OUTPUT_HANDLE = -11;
        private const int MY_CODE_PAGE = 437; 

        [STAThread]
        static void Main(string[] Args)
        {
                if (Args[0] != "")
                {
                    //AllocConsole();
                    commandlineTool(Args[0]);
                }
                else
                {

                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form2());
                }
static void commandlineTool(string filename)
{
    //all coding here
    AllocConsole();

    IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, true);
    FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
    System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
    StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
    standardOutput.AutoFlush = true;
    Console.SetOut(standardOutput);

    Console.WriteLine("File has been generated.");
    Console.ReadLine();
}

实际上AllocConsole()为进程分配新的控制台。

但是从这里打开一个新的控制台并显示消息,但我想在同一个控制台中显示消息。

【问题讨论】:

    标签: c# console cmd


    【解决方案1】:

    方法 A(首选,简单): 您可以使应用程序成为控制台应用程序,如果以 GUI 模式启动,则使用 FreeConsole 释放控制台。这个 IMO 是最好的解决方案。 唯一的缺点是启动应用程序时控制台窗口会非常短暂地显示。

    方法B(必要时使用): 您可以尝试使用AttachConsole(ATTACH_PARENT_PROCESS) 附加到父进程的控制台。如果父进程没有控制台,这将失败,在这种情况下,您必须重新使用 AllocConsole。

    此外,如果System.Console 类在您尝试附加/分配控制台时已经初始化,您将不得不重新连接输入/输出/错误流,如下所示:

        StreamWriter stdOut = new StreamWriter(Console.OpenStandardOutput());
        stdOut.AutoFlush = true;
        Console.SetOut(stdOut);
    
        StreamWriter stdErr = new StreamWriter(Console.OpenStandardError());
        stdErr.AutoFlush = true;
        Console.SetError(stdErr);
    
        StreamReader stdIn = new StreamReader(Console.OpenStandardInput());
        Console.SetIn(stdIn);
    

    否则你将没有输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      相关资源
      最近更新 更多