当然可以!您可以在执行命令的过程中添加一个检查,以判断是否需要关闭窗体。在下面的代码中,我将添加一个简单的逻辑来处理窗体关闭事件,并在执行命令期间进行检查。
我们可以通过使用 FormClosing
事件来实现这个功能。具体来说,当用户尝试关闭窗体时,您可以阻止窗口关闭,直到命令执行完成。
以下是修改后的代码片段:
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CmdExecutor
{
public partial class MainForm : Form
{
private bool isExecutingCommand = false; // 用于标识当前是否正在执行命令
public MainForm()
{
InitializeComponent();
InitializeComboBox();
}
private void InitializeComboBox()
{
// 添加可选的CMD命令
comboBoxCommands.Items.Add("ping");
comboBoxCommands.Items.Add("ipconfig");
comboBoxCommands.Items.Add("mkdir");
}
private void buttonExecute_Click(object sender, EventArgs e)
{
// 获取选中的命令和用户输入的参数
string selectedCommand = comboBoxCommands.SelectedItem?.ToString();
string additionalParams = textBoxCommandInput.Text.Trim();
// 检查是否选择了命令以及额外参数是否输入
if (string.IsNullOrEmpty(selectedCommand))
{
MessageBox.Show("请从下拉列表中选择一个CMD命令!");
return;
}
if (string.IsNullOrEmpty(additionalParams))
{
MessageBox.Show("请输入有效的额外参数!");
return;
}
// 组合完整的CMD命令,以空格分隔
string command = $"{selectedCommand} {additionalParams}".Trim();
ExecuteCommand(command);
}
private async void ExecuteCommand(string command)
{
isExecutingCommand = true; // 设置正在执行状态
textBoxLog.Clear();
ProcessStartInfo processStartInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (Process process = new Process { StartInfo = processStartInfo })
{
process.OutputDataReceived += (sender, args) =>
AppendLog(args.Data); // 实时更新日志
process.ErrorDataReceived += (sender, args) =>
AppendLog(args.Data); // 实时更新错误日志
process.Start();
// 开始异步读取输出和错误流
process.BeginOutputReadLine();
process.BeginErrorReadLine();
await Task.Run(() =>
{
// 将命令发送到cmd并退出cmd环境以保持窗口关闭。
process.StandardInput.WriteLine(command);
process.StandardInput.WriteLine("exit");
// 等待进程结束
process.WaitForExit();
});
}
isExecutingCommand = false; // 执行完成后设置为不再执行状态
}
private void AppendLog(string message)
{
if (!string.IsNullOrEmpty(message))
{
if (textBoxLog.InvokeRequired)
{
textBoxLog.Invoke(new Action<string>(AppendLog), message);
}
else
{
textBoxLog.AppendText(message + Environment.NewLine);
textBoxLog.ScrollToCaret(); // 自动滚动到最底部
}
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (isExecutingCommand)
{
MessageBox.Show("当前正在执行CMD命令,请稍等...");
e.Cancel = true; // 取消关闭事件,直到执行完成
}
base.OnFormClosing(e);
}
}
}
修改点说明:
- 新增字段: 添加
private bool isExecutingCommand
来跟踪当前是否有命令在运行。 - 设置状态: 在
ExecuteCommand
方法开始时设置isExecutingCommand
为true
,在完成后设置为false
。 - 重写窗体关闭方法: 重写
OnFormClosing
方法。如果有命令正在执行,则显示消息框并取消关闭操作。
这样一来,当用户尝试关闭窗体而又有 CMD 命令正在运行时,会提示他们等候。
内容由零声教学AI助手提供,问题来源于学员提问