如何将控制台输出添加到windows wpf应用程序c#
本文关键字:windows wpf 应用程序 添加 控制台 输出 | 更新日期: 2023-09-27 18:09:58
我想添加一个额外的控制台窗口来从我的WPF应用程序中记录实时信息。任何想法?
Bayo
回答:控制台应用程序在项目属性为我工作。谢谢的
别这么做。
查看log4net或NLog的日志输出到文件。通过对这些框架的正确配置,您可以获得更多的功能(不同的日志级别,自动时间戳,每个日志行前面的自动类名)
同时,您可能还想实现您自己的facade,以便将所使用的日志框架隐藏在代码的其余部分中。这将允许您在需要时轻松更改日志记录框架。
如果你想为你的程序同时拥有一个控制台和一个GUI窗口,你可以通过将项目编译为console application
(csc /target:exe
)来实现这个行为。但要注意:这肯定会导致糟糕的可用性,因为没有用户会期望你的应用同时拥有控制台和GUI窗口。
您可以调用AttachConsole WIN API函数,然后使用PInvoke调用此函数:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(uint dwProcessId);
const uint ATTACH_PARENT_PROCESS = 0x0ffffffff; // default value if not specifing a process ID
// Somewhere in main method
AttachConsole(ATTACH_PARENT_PROCESS);
谢谢你的建议。以下是向WPF应用程序添加控制台窗口所需的所有步骤。我们修改了WPF测试应用程序,以便在夜间测试过程中可以从命令行调用它。唯一的故障是当应用程序从控制台运行时,在调用FreeConsole()并退出应用程序后,命令提示符不会立即写入控制台窗口。FreeConsole()函数似乎缺少对Flush()类函数的调用,以强制将命令提示符写入控制台窗口。我的理由是控制台窗口的上下箭头历史是可用的,并且控制台接受另一个命令,但是当下一个应用程序运行并写入控制台窗口时,丢失的命令提示符将与它一起写入。
- 在project properties Application选项卡中,保留Output Type = Windows Application。
- 右键单击App.xaml,选择属性
- 设置构建操作= Page
-
打开App.xaml.cs,像下面这样修改App类。
public partial class App : Application { [DllImport("kernel32.dll", SetLastError = true)] static extern bool AttachConsole(uint dwProcessId); [DllImport("kernel32.dll", SetLastError = true)] static extern bool FreeConsole(); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] internal static extern int GetConsoleTitle(System.Text.StringBuilder sbTitle, int capacity); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] internal static extern bool SetConsoleTitle(string sTitle); [STAThread] public static int Main(string[] args) { Boolean hasExceptionOccured = false; System.Text.StringBuilder sbTitle = new System.Text.StringBuilder(); try { // If the user does not provide any parameters assume they want to run in GUI mode. if (0 == args.Length) { var application = new App(); application.InitializeComponent(); application.Run(); } else { const uint ATTACH_PARENT_PROCESS = 0x0ffffffff; // Default value if not specifying a process ID. // Attach to the console which launched this application. AttachConsole(ATTACH_PARENT_PROCESS); // Get the current title of the console window. GetConsoleTitle(sbTitle, 64); // Set the console title to the name and version of this application. SetConsoleTitle(Global.thisProgramsName + " - v" + Global.thisProductVersion); // Create a instance of your console class and call it’s Run() method. var mainConsole = new ReportTester.MainConsole(); mainConsole.Run(args); } } catch (System.Exception ex) { System.Console.WriteLine(ex.Message); System.Console.WriteLine(ex.StackTrace); if (null != ex.InnerException) { System.Console.WriteLine(ex.InnerException.Message); System.Console.WriteLine(ex.InnerException.StackTrace); } hasExceptionOccured = true; } finally { // Since the console does not display the prompt when freed, we will provide one here. System.Console.Write(">"); // Restore the console title. SetConsoleTitle(sbTitle.ToString()); // Free the console. FreeConsole(); } return (hasExceptionOccured ? 1 : 0); } }
要求不明确。听起来,唯一真正的要求似乎是能够重定向标准输出;似乎不需要控制台窗口了。
在空白(新)WPF应用程序中添加以下内容到Loaded事件或其他内容:
Stream StdoutStream = OpenStandardOutput();
StreamWriter Stdout = new StreamWriter(StdoutStream);
Stdout.WriteLine("Line one");
Stdout.WriteLine("Line two");
Stdout.WriteLine("Hello");
Stdout.WriteLine("Bye");
Stdout.Flush();
Stdout.Close();
然后从命令提示符执行程序并将标准输出重定向到文件。输出将在文件中。标准输入可以用相应的方式重定向。
这对于标准IO是我们无法控制的需求的情况非常有用。我们可以有一个GUI窗口与标准IO相结合。
如果你想在你的程序中同时拥有控制台和GUI窗口,你可以通过将项目编译为控制台应用程序来实现这一点。
打开项目属性,将输出类型更改为console application
现在,当您运行时,您将得到WPF窗口和控制台窗口。