internal static void ChangeFolder(this ConEmuControl terminal, string path) { if (terminal?.RunningSession == null || string.IsNullOrWhiteSpace(path)) { return; } switch (AppSettings.ConEmuTerminal.ValueOrDefault.ToLower()) { case "bash": if (PathUtil.TryConvertWindowsPathToPosix(path, out var posixPath)) { terminal.ClearCurrentLineWithMacroAndRunCommand($"cd {posixPath.QuoteNE()}"); } break; case "cmd": terminal.ClearCurrentLineWithEscapeAndRunCommand($"cd /D {path.QuoteNE()}"); break; case "powershell": case "pwsh": terminal.ClearCurrentLineWithEscapeAndRunCommand($"cd {path.QuoteNE()}"); break; default: break; } }
public ConsoleEmulatorOutputControl() { Controls.Add(_terminal = new ConEmuControl() { Dock = DockStyle.Fill, AutoStartInfo = null /* don't spawn terminal until we have gotten the command */ }); }
private static void KillProcess(ConEmuControl terminal) { ConEmuSession session = terminal.RunningSession; if (session != null) { session.SendControlCAsync(); } }
private static Form CreatePingForm() { var form = new Form() { AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, Padding = new Padding(10), Text = "Ping Command" }; FlowLayoutPanel stack; form.Controls.Add(stack = new FlowLayoutPanel() { Dock = DockStyle.Fill, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, FlowDirection = FlowDirection.TopDown }); stack.Controls.Add(new Label() { AutoSize = true, Dock = DockStyle.Top, Text = "Running the ping command.", Padding = new Padding(5) }); Label labelWaitOrResult; stack.Controls.Add(labelWaitOrResult = new Label() { AutoSize = true, Dock = DockStyle.Top, Text = "Please wait…", BackColor = Color.Yellow, Padding = new Padding(5) }); ConEmuControl conemu; var sbText = new StringBuilder(); stack.Controls.Add(conemu = new ConEmuControl() { AutoStartInfo = null, MinimumSize = new Size(800, 600), Dock = DockStyle.Top }); ConEmuSession session = conemu.Start(new ConEmuStartInfo() { AnsiStreamChunkReceivedEventSink = (sender, args) => sbText.Append(args.GetMbcsText()), ConsoleProcessCommandLine = "ping 8.8.8.8", LogLevel = ConEmuStartInfo.LogLevels.Basic }); session.ConsoleProcessExited += delegate { Match match = Regex.Match(sbText.ToString(), @"\(.*\b(?<pc>\d+)%.*?\)", RegexOptions.Multiline); if (!match.Success) { labelWaitOrResult.Text = "Ping execution completed, failed to parse the result."; labelWaitOrResult.BackColor = Color.PaleVioletRed; } else { labelWaitOrResult.Text = $"Ping execution completed, lost {match.Groups["pc"].Value} per cent of packets."; labelWaitOrResult.BackColor = Color.Lime; } }; session.ConsoleEmulatorClosed += delegate { form.Close(); }; return(form); }
private void setupConEmu() { ConEmuStartInfo startInfo = new ConEmuStartInfo(); startInfo.ConEmuExecutablePath = @"C:\Program Files\ConEmu\ConEmu64.exe"; startInfo.GreetingText = $"ConEmu version [{FileVersionInfo.GetVersionInfo(_conEmuPath).ProductVersion}]"; startInfo.GreetingText += $"ngrok version [{FileVersionInfo.GetVersionInfo(_ngrokPath).ProductVersion}"; startInfo.ConsoleProcessCommandLine = _ngrokPath + " start --none"; _control = new ConEmuControl(); _session = _control.Start(startInfo); pnlBottom.Controls.Add(_control); _control.Dock = DockStyle.Fill; _control.Enabled = false; }
public override void Reset() { if (_terminal != null) { KillProcess(); Controls.Remove(_terminal); _terminal.Dispose(); } Controls.Add(_terminal = new ConEmuControl() { Dock = DockStyle.Fill, AutoStartInfo = null /* don't spawn terminal until we have gotten the command */ }); }
public override void Reset() { if (_terminal != null) { KillProcess(); _panel.Controls.Remove(_terminal); _terminal.Dispose(); } _panel.Controls.Add( _terminal = new ConEmuControl() { Dock = DockStyle.Fill, AutoStartInfo = null, /* don't spawn terminal until we have gotten the command */ IsStatusbarVisible = false }); }
public PanelConsole(ConsoleSession session) { InitializeComponent(); AutoSize = true; Text = session.SessionName; //Resize += new System.EventHandler(TermPanel_Resize); Controls.Add(conemu = new ConEmuControl() { AutoStartInfo = null, Dock = DockStyle.Fill }); con_session = conemu.Start(new ConEmuStartInfo() { ConsoleProcessCommandLine = session.CommandLine }); }
public override void Reset() { ConEmuControl oldTerminal = _terminal; _terminal = new ConEmuControl { Dock = DockStyle.Fill, IsStatusbarVisible = false }; if (oldTerminal != null) { KillProcess(oldTerminal); _panel.Controls.Remove(oldTerminal); oldTerminal.Dispose(); } _panel.Controls.Add(_terminal); }
public static void ChangeFolder(this ConEmuControl terminal, IShellDescriptor shell, string path) { if (terminal?.RunningSession is null || shell is null || string.IsNullOrWhiteSpace(path)) { return; } string command = shell.GetChangeDirCommand(path); switch (shell.Name) { case BashShell.ShellName: terminal.RunningSession.BeginGuiMacro("Keys").WithParam("^A").WithParam("^K").ExecuteSync(); terminal.RunningSession.WriteInputTextAsync(command + Environment.NewLine); break; default: terminal.RunningSession.WriteInputTextAsync($"\x1B{command}{Environment.NewLine}"); break; } }
private static void KillProcess(ConEmuControl terminal) { terminal.RunningSession?.SendControlCAsync(); }
private static Form RenderView(Form form) { form.Size = new Size(800, 600); ConEmuControl conemu; form.Controls.Add(conemu = new ConEmuControl() { Dock = DockStyle.Fill, MinimumSize = new Size(200, 200), IsStatusbarVisible = true }); if (conemu.AutoStartInfo != null) { conemu.AutoStartInfo.SetEnv("one", "two"); conemu.AutoStartInfo.SetEnv("geet", "huub"); conemu.AutoStartInfo.GreetingText = "• Running \"cmd.exe\" as the default shell in the terminal. \n\n"; //conemu.AutoStartInfo.GreetingText = "\"C:\\Program Files\\Git\\bin\\git.exe\" fetch --progress \"--all\" "; // A test specimen with advanced quoting conemu.AutoStartInfo.IsEchoingConsoleCommandLine = true; } //conemu.AutoStartInfo = null; TextBox txt; form.Controls.Add(txt = new TextBox() { Text = "AnotherFocusableControl", AutoSize = true, Dock = DockStyle.Top }); FlowLayoutPanel stack; form.Controls.Add(stack = new FlowLayoutPanel() { FlowDirection = FlowDirection.LeftToRight, Dock = DockStyle.Top, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink }); Button btn; stack.Controls.Add(btn = new Button() { Text = "Paste Command", AutoSize = true, Dock = DockStyle.Left }); btn.Click += delegate { conemu.RunningSession?.WriteInputText("whois microsoft.com" + Environment.NewLine); }; stack.Controls.Add(btn = new Button() { Text = "Write StdOut", AutoSize = true, Dock = DockStyle.Left }); btn.Click += delegate { conemu.RunningSession?.WriteOutputText("\x001B7\x001B[90mEcho \"Hello world!\"\x001B[m\x001B8"); }; stack.Controls.Add(btn = new Button() { Text = "Query HWND", AutoSize = true, Dock = DockStyle.Left }); btn.Click += delegate { conemu.RunningSession?.BeginGuiMacro("GetInfo").WithParam("HWND").ExecuteAsync().ContinueWith(task => txt.Text = $"ConEmu HWND: {Regex.Replace(task.Result.Response, "\\s+", " ")}", TaskScheduler.FromCurrentSynchronizationContext()); }; stack.Controls.Add(btn = new Button() { Text = "Query PID", AutoSize = true, Dock = DockStyle.Left }); btn.Click += delegate { conemu.RunningSession?.BeginGuiMacro("GetInfo").WithParam("PID").ExecuteAsync().ContinueWith(task => txt.Text = $"ConEmu PID: {Regex.Replace(task.Result.Response, "\\s+", " ")}", TaskScheduler.FromCurrentSynchronizationContext()); }; stack.Controls.Add(btn = new Button() { Text = "Kill Payload", AutoSize = true, Dock = DockStyle.Left }); btn.Click += delegate { conemu.RunningSession?.KillConsoleProcessAsync(); }; stack.Controls.Add(btn = new Button() { Text = "Ctrl+C", AutoSize = true, Dock = DockStyle.Left }); btn.Click += delegate { conemu.RunningSession?.SendControlCAsync(); }; CheckBox checkStatusBar; stack.Controls.Add(checkStatusBar = new CheckBox() { Text = "StatusBar", Checked = conemu.IsStatusbarVisible }); checkStatusBar.CheckedChanged += delegate { conemu.IsStatusbarVisible = checkStatusBar.Checked; }; TextBox txtOutput = null; stack.Controls.Add(btn = new Button() { Text = "&Ping", AutoSize = true, Dock = DockStyle.Left }); btn.Click += delegate { if (conemu.IsConsoleEmulatorOpen) { MessageBox.Show(form, "The console is busy right now.", "Ping", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } if (txtOutput == null) { form.Controls.Add(txtOutput = new TextBox() { Multiline = true, Dock = DockStyle.Right, Width = 200 }); } conemu.Start(new ConEmuStartInfo() { ConsoleProcessCommandLine = "ping ya.ru", IsEchoingConsoleCommandLine = true, AnsiStreamChunkReceivedEventSink = (sender, args) => txtOutput.Text += args.GetMbcsText(), WhenConsoleProcessExits = WhenConsoleProcessExits.KeepConsoleEmulatorAndShowMessage, ConsoleProcessExitedEventSink = (sender, args) => txtOutput.Text += $"Exited with ERRORLEVEL {args.ExitCode}.", GreetingText = $"This will showcase getting the command output live in the backend.{Environment.NewLine}As the PING command runs, the textbox would duplicate its stdout in real time.{Environment.NewLine}{Environment.NewLine}" }); }; stack.Controls.Add(btn = new Button() { Text = "&Choice", AutoSize = true, Dock = DockStyle.Left }); btn.Click += delegate { conemu.RunningSession?.CloseConsoleEmulator(); DialogResult result = MessageBox.Show(form, "Keep terminal when payload exits?", "Choice", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (result == DialogResult.Cancel) { return; } ConEmuSession session = conemu.Start(new ConEmuStartInfo() { ConsoleProcessCommandLine = "choice", IsEchoingConsoleCommandLine = true, WhenConsoleProcessExits = result == DialogResult.Yes ? WhenConsoleProcessExits.KeepConsoleEmulatorAndShowMessage : WhenConsoleProcessExits.CloseConsoleEmulator, ConsoleProcessExitedEventSink = (sender, args) => MessageBox.Show($"Your choice is {args.ExitCode} (powered by startinfo event sink).") }); #pragma warning disable 4014 ShowMessageForChoiceAsync(session); #pragma warning restore 4014 }; return(form); }
private static void ClearCurrentLineWithEscapeAndRunCommand(this ConEmuControl terminal, string command) { terminal.RunningSession.WriteInputTextAsync("\x1B" + command + Environment.NewLine); }
private static void ClearCurrentLineWithMacroAndRunCommand(this ConEmuControl terminal, string command) { // Use a ConEmu macro to send the sequence for clearing the bash command line terminal.RunningSession.BeginGuiMacro("Keys").WithParam("^A").WithParam("^K").ExecuteSync(); terminal.RunningSession.WriteInputTextAsync(command + Environment.NewLine); }