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)
不幸的是,控制台窗口闪烁半秒钟就是这样.
请不要回答我真正想做的事情,因为现在我只是好奇,如果可能的话:)
你很幸运.我刚刚解决了这个我在这里漂浮的代码生成器玩具项目.
使用AttachConsole或AllocConsoleWin32 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)