Создание терминала в программе 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;
}