Создание терминала в программе C# WinForms

Я хотел бы встроить терминал в приложение C# WinForms, для использования с связью через последовательные порты, терминал по сети или любой другой вид команд / ответных механизмов.

Я подумал, что самым простым способом будет открыть консоль Windows и перенаправить потоки stdin, stdout и stderr в TextStreams в моей программе, но я не могу найти очевидный способ сделать это. Я не хочу использовать System.Console и смешивать его с другими сообщениями об ошибках / отладках.

Еще лучше, если я смогу встроить консоль в качестве элемента управления в WinForm.

Возможно ли любое из этих решений без каких-либо сторонних библиотек или огромного количества кода?

Спасибо!

1 ответ

Используйте этот класс для доступа к консоли из WinForms. Вам нужно будет выделить консоль и сохранить ее в переменной для последующих манипуляций. Ниже приведен пример кода, который я использовал в прошлом проекте. Затем вы можете вызвать метод Console.WriteLine("") для отправки текста в окно. Надеюсь это поможет!

public class ConsoleHelper
{
    public const int MF_BYCOMMAND = 0x00000000;
    public const int SC_CLOSE = 0xF060;

    /// <summary>
    /// Allocates a new console for current process.
    /// </summary>
    [DllImport("kernel32.dll")]
    public static extern Boolean AllocConsole();

    /// <summary>
    /// Frees the console.
    /// </summary>
    [DllImport("kernel32.dll")]
    public static extern Boolean FreeConsole();

    [DllImport("kernel32.dll")]
    public static extern IntPtr GetConsoleWindow();

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll")]
    public static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);

    [DllImport("user32.dll")]
    public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

    public const int SW_HIDE = 0;
    public const int SW_SHOW = 5;
}

Вот быстрая демонстрация:

    void OpenSerialConnection(int portnumber, System.Windows.Forms.NotifyIcon TrayIcon)
    {
        //Get console window
        handle = ConsoleHelper.GetConsoleWindow();
        if (handle.ToInt32() == 0)
        {
            //Create the console window
            ConsoleHelper.AllocConsole();
        }
        handle = ConsoleHelper.GetConsoleWindow();

        //Show console window
        ConsoleHelper.ShowWindow(handle, ConsoleHelper.SW_SHOW);

        //Remove close button from console window (can only be closed from code now)
        ConsoleHelper.DeleteMenu(ConsoleHelper.GetSystemMenu(ConsoleHelper.GetConsoleWindow(), false), ConsoleHelper.SC_CLOSE, ConsoleHelper.MF_BYCOMMAND);
        if (!serialPort1.IsOpen)
        {
            try
            {
                serialPort1.PortName = "COM" + portnumber.ToString();
                serialPort1.BaudRate = Form1.BaudRate;
                serialPort1.Open();
            }
            catch (Exception error)
            {
                TrayIcon.ShowBalloonTip(3000, "Error in " + error.Source.ToString(), "The program encountered an error while trying to open the serial connection. This may be due to closing the program prematurely. Try unplugging your board and restarting the program!", System.Windows.Forms.ToolTipIcon.Error);
                //Hide console window
                ConsoleHelper.ShowWindow(handle, ConsoleHelper.SW_HIDE);
            }
        }
        Console.Clear();
        Console.BackgroundColor = ConsoleColor.Gray;
        Console.ForegroundColor = ConsoleColor.Black;
        Console.WriteLine("====CONSOLE OPENED ON (COM PORT " + portnumber.ToString() + ")=======");
        Console.WriteLine("===========BAUD RATE: " + Form1.BaudRate.ToString() + "=============");
        Console.BackgroundColor = ConsoleColor.Black;
        Console.ForegroundColor = ConsoleColor.White;
    }
Другие вопросы по тегам