问题描述
尝试调整托管 ConEmu 控件的 WinForm 的现有 C# 示例来运行一系列任务,但没有成功:我遇到了 ConEmu WinForm 控件的奇怪行为,我正在挠头。我只见过边界非常有限的工作样本:
- 每次重新创建托管 ConEmu Control 的表单
- 无需以编程方式等待命令结束即可运行以下命令
但是当转移到更真实的环境时,我遇到了以下问题:
- 我无法在表单中重复使用相同的控件
- 事件不允许我等待 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 (将#修改为@)