学习【C# Windows窗体】:获得进程的输出

2024-09-06 23:48

本文主要是介绍学习【C# Windows窗体】:获得进程的输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在之前的博客《创建能启动其他程序的Windows窗体》中,我启动了一个其他程序的进程。而进程的输出都显示在控制台窗口中。我在想,可否能读取这些输出,这样就可以配合一些界面显示了,例如约定一个表示进度的信息,来指导进度条的值,这虽然不怎么稳定,但是如果运行的程序也是由自己维护的,那这种方式我觉得没什么不妥。
查了一些资料之后,我发现读取进程的输出很简单(学习的过程中我参考了C#Process的OutputDataReceived事件不触发的解决方法_c#_C#-CSDN博客)。下面我记录下来步骤和自己的一个实践。

步骤

1.

首先,将进程的StartInfoUseShellExecute设为false,将RedirectStandardOutput设为true

process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true;

UseShellExecute解释如下:
在这里插入图片描述
RedirectStandardOutput解释如下:
在这里插入图片描述

2.

其次,设置接收信息的函数,这里选择直接创建一个匿名函数:

process.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler((SenderObject, EventArgs) =>
{//函数体
});

在这里插入图片描述

3.

进程开始后要调用BeginOutputReadLine

process.BeginOutputReadLine();

在这里插入图片描述

实践

C++程序

先写一个C++程序用来当调用的程序,如下:

#include <Windows.h>
#include<iostream>
using namespace std;int main()
{for (int i = 0; i < 100; i++){Sleep(200);//睡眠0.2秒cout << "progress_" << i << endl;}
}

我约定progress_ 之后的数字应该为进度条的进度值。
运行它后就是每隔0.2秒打印一下进度:
在这里插入图片描述
做完后将程序放在D:\Test\TestProgress.exe

C# Windows窗体

拖入一个按钮和进度条
在这里插入图片描述
写button1的回调函数:

private void button1_Click(object sender, EventArgs e)
{System.Diagnostics.Process process = new System.Diagnostics.Process();process.StartInfo.FileName = "D:/Test/TestProgress.exe";   //程序exe路径 process.StartInfo.UseShellExecute = false;        process.StartInfo.RedirectStandardOutput = true;process.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler((SenderObject, EventArgs) =>{string message = EventArgs.Data;//得到输出的字符串。//按照约定好的规则进行处理:if(message.StartsWith("progress")){string ProgressValueStr = message.Split('_')[1];//分割后第二个字符串progressBar1.Value = int.Parse(ProgressValueStr);}});process.Start();process.BeginOutputReadLine();
}

但是运行后出现了报错:
在这里插入图片描述
看来默认情况下,是不允许在创建这个控件外的其他线程中访问它的。查了资料后,发现要让CheckForIllegalCrossThreadCallsfalse来阻止这种警告,于是我将其加到了form1的构造函数中了:

public Form1()
{InitializeComponent();CheckForIllegalCrossThreadCalls = false;
}

之后成功如预期运行:
在这里插入图片描述

这篇关于学习【C# Windows窗体】:获得进程的输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143467

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放