是否可以在C#/ .Net中将消息记录到cmd.exe?

pro*_*ick 5 .net c# logging cmd

是否可以将消息从WinForms应用程序记录到cmd.exe进程以编程方式启动?我尝试过以下代码的各种变体:

private void button1_Click(object sender, EventArgs e)
{
    Log("Button has been pressed");
}

private void Log(string message)
{
    var process = Process.Start(new ProcessStartInfo("cmd.exe", @"/K ""more""")
    {
        UseShellExecute = false,
        RedirectStandardInput = true,
    });
    process.StandardInput.WriteLine(message);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,控制台窗口闪烁半秒钟就是这样.

请不要回答我真正想做的事情,因为现在我只是好奇,如果可能的话:)

seh*_*ehe 6

你很幸运.我刚刚解决了这个我在这里漂浮的代码生成器玩具项目.

使用AttachConsoleAllocConsoleWin32 API可以通过System.Console.WriteLine像往常一样使用(或Read或Error.WriteLine等)来实现结果.

以下代码片段指出从控制台窗口启动表单应用程序时,并附加到其父控制台; 如果这不起作用,它将创建它自己的控制台,并记住保持打开(例如,在用户可以读取输出之前它不会消失).

    [DllImport("kernel32.dll")] static extern bool AllocConsole();
    [DllImport("kernel32.dll")] static extern bool AttachConsole(int pw);
    private static bool _hasConsole, _keepConsoleOpen;
    static private void EnsureConsole()
    {
        _hasConsole      =  _hasConsole || AttachConsole(-1);
        _keepConsoleOpen = !_hasConsole || _keepConsoleOpen;
        _hasConsole      =  _hasConsole || AllocConsole();
    }

    [STAThread]
    private static void Main(string[] args)
    {
          EnsureConsole();

          // the usual stuff -- your program

          if (_keepConsoleOpen)
          {
              Console.WriteLine("(press enter)...");
              Console.Read();
          }
    }
Run Code Online (Sandbox Code Playgroud)