Лично я бы использовал обработчики событий для управления консолью, которая одновременно обрабатывает как ввод, так и вывод, создал класс ScreenManager или что-то еще, внутри этого класса добавил метод void RunProgram(), создал событие с обработчиком и необходимыми переменными для чтения ключ ввода "Console.ReadKey(bool).key".
static Consolekey newKey;
в вашей основной программе создайте экземпляр вашего класса «как вы его назвали», затем создайте поток внутреннего метода этого экземпляра, Thread coreThread = new Thread(delegate() {myinstance.myProgramMrthod()});
loop в вашем main, пока потоки не запустятся и не запустятся. пока (!Thread.IsAlive) ;
затем создайте основной цикл программы.
while (true)
{
}
затем для безопасности присоединитесь к своему пользовательскому потоку, чтобы основная программа не продолжалась до тех пор, пока пользовательский поток не будет закрыт/удален.
customThread.Join();
теперь у вас есть два потока, работающих отдельно.
вернитесь к своему классу, создайте переключатель внутри вашего метода обработчика событий.
switch (newkey)
{
case Consolekey.enter
Console.WriteLine("enter pressed");
break;
ect, ect.
default:
Console.write(newkey); // writes character key that dont match above conditions to the screen.
break;
}
придерживайтесь здесь своей логики с тем, как вы хотите обращаться с ключами. Как использовать несколько клавиш-модификаторов в C# может быть какой-то помощи.
внутри метода RunProgram() вашего экземпляра или того, что вы решите назвать, после того, как вы сделали любой код, который вам нужен, создайте бесконечный цикл для проверки изменения ключа.
while (true)
{
newKey = Console.ReadKey(true).Key;
if (newKey != oldKey)
{
KeyChange.Invoke();
}
}
этот цикл сохраняет любую нажатую клавишу, а затем проверяет, есть ли новая клавиша, если true запускает событие.
теперь у вас есть ядро того, что вы ищете, одна строка, которая циклически запрашивает новый ключ, в то время как основной цикл может отображать любой текст, который вы хотите отобразить.
две исправимые ошибки с этим, о которых я могу думать, одна «по умолчанию» внутри переключателя будет печатать на консоли заглавными буквами или строками. а другой - любой текст, добавленный в консоль, добавляется в точку курсора, поэтому он добавляется к тексту, который только что ввел пользователь.
как бы я ни хотел, так как я только что сделал это, как вы должны управлять текстом, добавленным в консоль. снова я использую событие. я мог бы использовать методы и функции повсюду, но события, как мне кажется, добавят программе гибкости при перемещении.
хорошо, поэтому мы хотим иметь возможность добавлять текст в консоль, не нарушая ввод, который мы вводим. сохранение ввода внизу;
создать нового делегата с подписью со строковым аргументом, недействительным делегатом myDelegate(string Arg). затем создайте событие с этим делегатом, назовите его новой строкой, новым вводом, как хотите.
обработчик событий примет строковый аргумент (представляющий текст обновления консоли: то, что вы хотите вставить в консоль над пользовательским вводом), он захватит текст, который пользователь вводил в консоль, сохранит его, а затем распечатает параметр string на консоль, затем распечатайте введенные пользователем данные.
лично я решил создать статическую строку вверху вне метода, инициализировать ее пустой, потому что она будет часто использоваться, и вы не хотите создавать новый идентификатор, а затем инициализировать переменную каждый раз, когда вызывается метод, а затем удалять его в конце метода, только чтобы воссоздать новый снова и снова.
вызовите строку «ввод» или что-то еще.
в область по умолчанию дескриптора события смены клавиши добавьте ввод +=newkey.
в консоли секции Consolekey.enter введите строку ввода, затем введите = string.empty Или string = "".
в обработчике событий добавить немного логики.
public void OnInsert(string Argument)
{
Console.CursorTop -= 1;
// moves the cursor to far left so new input overwrites the old.
// if arg string is longer, then print arg string then print input // string.
if (Argument.Length > input.Length)
{
Console.WriteLine(Argument);
Console.WriteLine(input);
}
else
{
// if the users input if longer than the argument text then print
// out the argument text, then print white spaces to overwrite the
// remaining input characters still displayed on screen.
for (int i = 0; i < input.Length;i++ )
{
if (i < Argument.Length)
{
Console.Write(Argument[i]);
}
else
{
Console.Write(' ');
}
}
Console.Write(Environment.NewLine);
Console.WriteLine(input);
}
}
hope this helps some of you, its not perfect, a quick put together test that works enough to be built on.
person
Gorlykio
schedule
22.12.2012