学习【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

相关文章

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L