ConEmu.Control.WinForms:无法运行命令序列

问题描述

尝试调整托管 ConEmu 控件的 WinForm 的现有 C# 示例来运行一系列任务,但没有成功:我遇到了 ConEmu WinForm 控件的奇怪行为,我正在挠头。我只见过边界非常有限的工作样本:

  1. 每次重新创建托管 ConEmu Control 的表单
  2. 无需以编程方式等待命令结束即可运行以下命令

但是当转移到更真实的环境时,我遇到了以下问题:

  • 我无法在表单中重复使用相同的控件
  • 事件不允许我等待 EndProcess 事件
  • 无论我做什么将 Wait(Process) 与 Run(NextProcess) 同步,它都不起作用(例如,我正在尝试 System.Thread.ManualResetEvent 和类似技术)

要复制,只需创建一个新的 WinForm 项目,添加 NuGet 包 ConEmu.Control.WinForms 并粘贴以下代码

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        ConEmuControlInit();
    }

    ConEmuControl conemu;
    int conEmuLastExitCode;
    private void ConEmuControlInit()
    {
        FlowLayoutPanel stack;
        this.Controls.Add(stack = new FlowLayoutPanel() { Dock = DockStyle.Fill,AutoSize = true,AutoSizeMode = AutoSizeMode.GrowAndShrink,FlowDirection = FlowDirection.TopDown });
        stack.Controls.Clear();
        stack.Refresh();
        stack.Controls.Add(conemu = new ConEmuControl() { AutoStartInfo = null,MinimumSize = new Size(800,600),Dock = DockStyle.Top });
        Button btnPing;
        stack.Controls.Add(btnPing = new Button() { Text = "Run commands sequence",Dock = DockStyle.Left });
        btnPing.Click += delegate { TestCommandsSequence(); };
    }

    private void TestCommandsSequence()
    {
        var success = ExecuteCommand("ping 8.8.8.8");
        success = ExecuteCommand("ping 8.8.4.4");
        success = ExecuteCommand("ping ya.ru");
    }

    private int ExecuteCommand(string command)
    {
        ConEmuSession session = conemu.Start(new ConEmuStartInfo()
        {
            ConsoleProcessCommandLine = command,LogLevel = ConEmuStartInfo.LogLevels.Basic,IsEchoingConsoleCommandLine = true,WhenConsoleProcessExits = WhenConsoleProcessExits.CloseConsoleEmulator
        });
        session.WaitForConsoleEmulatorCloseAsync().ContinueWith(scheduler: TaskScheduler.FromCurrentSynchronizationContext(),continuationAction: task =>
        {
            try
            {
                conEmuLastExitCode = conemu.RunningSession.GetConsoleProcessExitCode();
            }
            catch (Exception)
            {
                // nop
            }
            conemu.RunningSession?.CloseConsoleEmulator();
            Invalidate();
        });
        MessageBox.Show("Command executed!");
        return conEmuLastExitCode;
    }

}

WaitForConsoleEmulatorCloseAsync() 要么在进程结束时未触发,要么 ConEmu 控件在第二次尝试时被冻结,或者该命令实际上是在隐藏的后台控制台窗口中执行的...

顺便说一句,用一次运行替换命令序列并多次手动单击按钮正在工作,但是一旦我尝试使命令序列完全自动化(即使使用 BtnButton.PerformClick() 进行模拟),也不是工作:-(

有什么帮助吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)