在 WPF 窗口中从 CMD 捕获输出

Posted

技术标签:

【中文标题】在 WPF 窗口中从 CMD 捕获输出【英文标题】:Capturing output from CMD in a WPF window 【发布时间】:2019-02-23 16:03:18 【问题描述】:

我目前正在尝试从我的 C# WPF 程序运行一个简单的 CMD 函数,并在 WPF 程序中显示输出。我想我已经接近了,但它目前没有显示任何东西。该程序将打开并确认它应该运行 CMD 文件。一旦选择“是”,它应该打开一个新框架并运行程序,将其管道返回到框架。引用的 CMD 是一个简单的 netstat cmd。我已将 'CreateNoWindow' 更改为 False 并看到 CMD 打开,所以它似乎正在执行它。

编辑:我遗漏了一部分代码,哎呀!

编辑 2:更新代码以包含一些建议。不用找了。这可能与我使用框架的方式有关吗?

namespace WpfApp1

/// <summary>
/// Interaction logic for Page3.xaml
/// </summary>
    public partial class Page3 : Page
    
        public Page3()
        
            InitializeComponent();
        

        private void Frame_Navigated(object sender, NavigationEventArgs e)
        
            Task.Run(() =>  Muntrainout(); );
        

        public void Muntrainout()
        
            System.Diagnostics.Process muntrainout = new System.Diagnostics.Process();
            muntrainout.StartInfo.RedirectStandardOutput = true;
            muntrainout.StartInfo.RedirectStandardError = true;
            muntrainout.StartInfo.RedirectStandardInput = true;
            muntrainout.StartInfo.UseShellExecute = false;
            muntrainout.StartInfo.CreateNoWindow = true;
            muntrainout.StartInfo.FileName = @"C:\Users\user.name\Documents\Project\Test.cmd"; 
            muntrainout.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler((sender, e) =>
                 
                     Console.WriteLine(e.Data);
                 
            );
            // Error Handling
            muntrainout.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler((sender, e) =>  Console.WriteLine(e.Data); );
            muntrainout.Start();
            muntrainout.BeginOutputReadLine();
            muntrainout.WaitForExit();
        
    

【问题讨论】:

查看 MSDN 上的 Process.BeginOutputReadLine() 文章以获得良好的示例代码。它会提醒您为 OutputDataReceived 事件编写事件处理程序。 Task.Run() 会阻止您看到异常,请改用 Exited 事件。 @HansPassant 我似乎错过了将该部分放入我的代码中。对 c# 非常陌生,不确定这是否是您的意思。感谢您的意见! 尝试在 Start() 之前移动 muntrainout.OutputDataReceived。我见过的其他例子在开始这个过程之前就已经设置好了。 也看看...***.com/a/8809005/512365 @KornMuffin 实际上我在此之前查看了该线程并遵循您关于移动“Start();”的想法。不幸的是没有变化。一定有什么简单的东西我错过了,我就是放不下! 【参考方案1】:

假设您想在 frame 中显示输出...

这对我有用:

muntrainout.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler((sender, e) =>
            
                //Console.WriteLine(e.Data);
                Frame1.Dispatcher.Invoke(() =>  Frame1.Content += e.Data+Environment.NewLine; );

            

它看起来有点难看,但它显示输出...我不知道Console.WriteLine() 应该如何写入您的框架?

【讨论】:

这正是我正在寻找的,我只是不知道如何实现它。不过,Dispatcher 似乎无法正常工作,“object”不包含“Dispatcher”的定义。有什么我想念的吗?感谢您的意见! 这取决于...Frame1 是我在表单上给我的框架控件起的名字。但是还有其他方法可以获取dispatcher,查看这个帖子***.com/questions/11625208/… 知道了!出于某种原因,Frame1 的 x:name 是一个问题。将其更改为 Frame2 似乎工作正常。感谢您的帮助!

以上是关于在 WPF 窗口中从 CMD 捕获输出的主要内容,如果未能解决你的问题,请参考以下文章

SharpPcap - 从标准输出捕获

在 C++ 中从 FILE 结构解析为字符串

如何在 WPF 中从一个窗口移动到另一个窗口?

WPF 跟踪信息未显示在输出窗口中

在单元测试中捕获调试窗口输出?

从后台进程打开窗口并在 WPF 中从用户那里获取输入