ZBLOG

using System; using System.Diagnostics; using System.Windows.Forms; namespace CmdExecutor { public partial class MainForm : Form { public MainForm() { InitializeComponent(); InitializeComboBox(); ...

当然可以!您可以在执行命令的过程中添加一个检查,以判断是否需要关闭窗体。在下面的代码中,我将添加一个简单的逻辑来处理窗体关闭事件,并在执行命令期间进行检查。

我们可以通过使用 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);
          }
      }
}

修改点说明:

  1. 新增字段: 添加 private bool isExecutingCommand 来跟踪当前是否有命令在运行。
  2. 设置状态: 在 ExecuteCommand 方法开始时设置 isExecutingCommandtrue,在完成后设置为 false
  3. 重写窗体关闭方法: 重写 OnFormClosing 方法。如果有命令正在执行,则显示消息框并取消关闭操作。

这样一来,当用户尝试关闭窗体而又有 CMD 命令正在运行时,会提示他们等候。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19558

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?