1

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

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()为进程分配新的控制台。

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

4

1 回答 1

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);

否则你将没有输出。

于 2013-01-23T21:20:47.677 回答