在 C# Winforms 应用程序中嵌入 CMD 终端

     2023-02-16     208

关键词:

【中文标题】在 C# Winforms 应用程序中嵌入 CMD 终端【英文标题】:Embedding a CMD terminal in a C# Winforms application 【发布时间】:2015-10-12 10:37:48 【问题描述】:

我打算做的是构建一个应用程序,除其他外,它将像某些 IDE 一样嵌入一个命令行(我觉得这非常有用)。

这是我目前的代码,请注意这是一个 Winforms 项目:

public partial class Form1 : Form
    
        Process p = new Process();
        ProcessStartInfo info = new ProcessStartInfo();

        public Form1() 
            InitializeComponent();
        

        private void Form1_Load(object sender, EventArgs e) 
            info.FileName = "cmd.exe";
            info.RedirectStandardInput = true;
            info.RedirectStandardOutput = true;
            info.RedirectStandardError = true;
            info.UseShellExecute = false;
            info.CreateNoWindow = true;

            p.StartInfo = info;
            p.Start();
        

        private void button1_Click(object sender, EventArgs e) 
            using(StreamWriter sw = p.StandardInput) 
                if(sw.BaseStream.CanWrite) 
                    sw.WriteLine(textBox1.Text);
                
            
            textBox2.Text = p.StandardOutput.ReadToEnd();
            textBox3.Text = p.StandardError.ReadToEnd();
            p.WaitForExit();
        
    

如您所见,有 3 个文本框和一个按钮:

textbox1 用于输入命令 textbox2 用于标准输出 textbox3 用于标准错误

关于我的问题:

我只能输入一个命令,因为执行后,我的CMD窗口消失了。我知道它消失了,因为我设置了info.CreateNoWindow = false;,它确实消失了,如果我尝试输入另一个命令,我会得到一个异常。

我将如何继续保持我的 CMD 窗口“活动”,以便我可以随心所欲地使用它?简而言之,我想真正模仿 CMD 行为。

如果有不清楚的地方,请随时询问更多信息。

额外信息/我尝试了什么:

我尝试添加info.Attributes = "/K";,因为我知道/K 应该让CMD 保持活动状态。我还读到 p.WaitForExit(); 应该让 CMD 保持活动状态,但据我所知,这只是为了读取输出。不用说,我不需要它,因为我已经重定向了它的输出。这些解决方案都不起作用,但我完全有可能以错误的方式使用它们。

我需要该进程处于活动状态,这样我就可以使用cd 轻松导航并在需要时执行一系列命令,例如在访问ftpmysql 时。我知道我可以使用参数解决这两个示例,但不适用于每个应用程序。简而言之,每次都产生一个新进程不是我想要的。我希望该 CMD 界面始终处于启动状态。

cmd进程在

之后死掉
using(StreamWriter sw = p.StandardInput) 
    if(sw.BaseStream.CanWrite) 
        sw.WriteLine(textBox1.Text);
    

但我无法确定原因。

【问题讨论】:

using 语句导致 p.StandardInput 被释放(sw 只是对它的引用)。不要那样做 - 改为处理 p(当您不再需要它时)。 @PieterWitvoet 谢谢你的回答。所以基本上当我离开using 范围时 p 会被处理掉?如果没有 using 语句,我将如何继续使用 StreamWriter?我尝试在 Form1_Load 方法中声明 StreamWriter 并随后访问输出 p.StandardOutput,但我的应用程序挂起,没有任何异常。能详细点吗? 无论你是什么using 都会在using 块的末尾处理 - 因此每次输入命令时,您的代码都会处理进程的标准输入。您实际上是在处理对象的一部分并期望它像以前一样继续工作。只需删除 using 声明即可。 sw 不是您负责的新流编写器 - 它是对 p.StandardInput 的引用。处理 p 将负责为您处理这些流编写器。 @PieterWitvoet 在您撰写最后一条评论时,我一直在尝试使用没有 using 块的 StreamWriter。调试器清楚地显示命令已发送到进程,但我的应用程序在尝试读取输出时挂起,例如textBox2.Text = p.StandardOutput.ReadToEnd();。不用说,我的应用程序没有输出。不过有趣的是:如果我手动关闭 CMD 窗口(生成的进程),我的应用程序会收到输出。但自从我关闭它后,我不能再使用这个过程了。你知道为什么会这样吗? 我假设ReadToEnd 挂起,因为流没有结束。尝试在阅读内容之前先查看信息流。 【参考方案1】:

CMD 控制台提供的是执行预定义函数的接口(在 System32 或 %PATH% 中)。 Process 类也有同样的能力,你可以做的是当用户输入命令文本并在 textbox2 中按回车键(可以是多行,黑背景,白文本)你可以通过命令文本到 Process p = new Process(); 并附加结果,使其看起来像单个 cmd 会话。现在在传递整个命令文本之前,我们需要分隔参数(如果有的话),这是出现在第一个空格之后的文本。示例:

SHUTDOWN /S /T 10

其中 Shutdown 将是文件名,而 /S /T 10 将是参数。

在执行设置ProcessStartInfo的默认目录之前:-

_processStartInfo.WorkingDirectory = @"%Path%";

否则默认为 System32 文件夹。

【讨论】:

这实际上是一个想法,我不久前也在 C++ 应用程序中考虑并实现了它。不幸的是,它只是真实事物的影子,一种模拟,一种解决方法。不是一个实际的解决方案。这正是我在 C# 中重写类似应用程序的原因。但感谢您的意见,我将保留此作为最后的手段。

在 C# (WinForms) 中拦截应用程序中所有控件的单击事件

】在C#(WinForms)中拦截应用程序中所有控件的单击事件【英文标题】:InterceptingclickeventforallcontrolsinanappinC#(WinForms)【发布时间】:2011-05-1520:24:01【问题描述】:我想制作一个应用程序来拦截我应用程序所有形式的所有UI事件并将它... 查看详情

在 C# winforms 应用程序中使用文本框过滤 Treeview

】在C#winforms应用程序中使用文本框过滤Treeview【英文标题】:FilteraTreeviewwithaTextboxinaC#winformsapp【发布时间】:2012-01-0519:34:10【问题描述】:我的C#winform中有一个TreeView。我希望能够通过搜索框添加搜索功能。基本上当用户输入字... 查看详情

在 C# Winforms 应用程序中键入时如何搜索 SQL Server 数据库?

】在C#Winforms应用程序中键入时如何搜索SQLServer数据库?【英文标题】:HowcanisearchSQLServerDatabasewhiletypinginC#Winformsapplication?【发布时间】:2019-12-2710:04:19【问题描述】:我在winforms应用程序的数据网格视图中显示了一些sql表结果。... 查看详情

如何在 C# Winforms 程序的文本框中突出显示文本?

】如何在C#Winforms程序的文本框中突出显示文本?【英文标题】:HowdoIhighlightTextinaTextboxinaC#Winformsprogram?【发布时间】:2011-01-2515:24:26【问题描述】:我有一个带有多个文本框的C#Winforms程序。我使用每个框的属性在其中放置文本... 查看详情

如何在 C# Winforms 应用程序中发送 PayPal REST API 退款?

】如何在C#Winforms应用程序中发送PayPalRESTAPI退款?【英文标题】:HowdoyousendaPayPalRESTAPIRefundinaC#Winformsapp?【发布时间】:2018-08-0712:15:21【问题描述】:我在网上找到的用于在C#中实现PayPalRESTAPI的文档非常少。我已经完成了获取访问... 查看详情

如何在 C# Winforms 的下拉列表控件中获取数据源名称

...】:2014-01-0310:52:59【问题描述】:您好,我正在开发一个应用程序来将数据从一个系统检索到另一个远程系统。为此,我首先通过下面的屏幕设置应用程序的连接字符串。当我从第一个dropdownlist选择SQLServer时,我需要 查看详情

如何在 C# Winforms 应用程序中取消执行长时间运行的异步任务

】如何在C#Winforms应用程序中取消执行长时间运行的异步任务【英文标题】:Howtocancelexecutionofalong-runningasynctaskinaC#Winformsapp【发布时间】:2016-05-0518:41:48【问题描述】:我是一个缺乏经验的C#程序员,需要帮助管理我的程序流程。... 查看详情

使用 PostgreSql 和 ADO.NET 在 C# WinForms 中锁定记录和表

...work4.6.1、WinForms、PostgreSQL6.4beta4和Npgsql和ADO.NET。我当前的应用程序是一个多用户应用程序 查看详情

在winforms c#中自动调整项目/控件的大小显示错误

...-01-0503:41:51【问题描述】:我一直在尝试让我的windows窗体应用程序自动调整大小,即当用户调整应用程序大小时,它的控件也会相应地调整大小,在网上搜索后,我遇到了以下.cs文件形式的代码:usingSystem;usingSyst 查看详情

如何在 .NET 4.0 C# WinForms 应用程序中播放 SWF 文件?

】如何在.NET4.0C#WinForms应用程序中播放SWF文件?【英文标题】:HowtoplaySWFfilein.NET4.0C#WinFormsapplication?【发布时间】:2014-06-2007:54:25【问题描述】:我有一个SWF文件,我希望它也可以离线使用。我已经搜索了如何播放SWF文件。但是... 查看详情

如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?

】如何在C#控制台或WinForms应用程序中使用Windows安全的确认证书弹出窗口选择证书?【英文标题】:HowtoselectaCertificateusingtheWindowsSecurity\'sConfirmCertificatepopupinC#consoleorWinFormsapplication?【发布时间】:2020-07-0922:56:26【问题描述】:我... 查看详情

C# PayPal REST API Winforms 应用程序中的授权代码在哪里?

】C#PayPalRESTAPIWinforms应用程序中的授权代码在哪里?【英文标题】:WheredoesauthorizationcodegoinC#PayPalRESTAPIWinformsapp?【发布时间】:2017-12-0209:29:45【问题描述】:我正在尝试访问PayPal的API以通过C#.NETWinforms应用程序向客户提交发票,... 查看详情

c# winforms如何保存用户输入的数据

...就像他们在文本框中键入或选中复选框并在下次再次启动应用程序时关闭应用程序一样,他们输入的数据就像已保存一样。这是在c#VS2010.NET4.0中【问题讨论】:最好说明您要保存它的位置,即sql数据库、.config用 查看详情

在 WinForms 中嵌入 XNA

】在WinForms中嵌入XNA【英文标题】:EmbedXNAinWinForms【发布时间】:2011-09-2708:08:01【问题描述】:是否可以在C#WinForm或C++窗口中嵌入XNA游戏。如果是,那么如何。我想使用普通的UI控件并拥有一个游戏的窗口界面,以进行更具交互... 查看详情

在 c# winforms 中扩展文本框

】在c#winforms中扩展文本框【英文标题】:Extendtextboxinc#winforms【发布时间】:2021-11-2212:12:57【问题描述】:我一直在寻找这个问题的答案(我在c#中使用winforms)。我正在寻找图片中的控件,单击时带有向下箭头的文本框打开了扩... 查看详情

在 C# 程序中嵌入外部可执行文件

...】:2022-01-1920:24:39【问题描述】:如何在我的C#Windows窗体应用程序中嵌入外部可执行文件?编辑:我需要嵌入它,因为它是一个外部免费控制台应用程序(用C++制作),我从中读取输出值以在我的程序中使用。嵌入它会更好,更... 查看详情

在 C# 程序中嵌入外部可执行文件

...】:2010-10-2208:52:28【问题描述】:如何在我的C#Windows窗体应用程序中嵌入外部可执行文件?编辑:我需要嵌入它,因为它是一个外部免费控制台应用程序(用C++制作),我从中读取输出值以在我的程序中使用。嵌入它会更好,更... 查看详情

拖放在 C# Winforms 应用程序中不起作用

】拖放在C#Winforms应用程序中不起作用【英文标题】:DragandDropnotworkinginC#WinformsApplication【发布时间】:2014-12-2501:08:37【问题描述】:我正在尝试创建一个可以将文件/文件夹拖放到其上的Windows窗体。我在WinForms应用程序中有以下... 查看详情