Редактирование текста в консоли

Нужно сделать редактирование текста в консоли (с рабочим перемещением курсора по стрелкам вверх-вниз вправо-влево). На просторах великого и необъятного нашел решение для редактирования строк:

#include <string>
#include <iostream>
#include <Windows.h> 
using namespace std;
int main()
{
    system("chcp 1251");
    system("cls");
    COORD coord;
    string Input;
    cout << "Введите строку: ";
    getline(cin, Input);
    cout << "Изменить строку: " << "\n";
    CONSOLE_SCREEN_BUFFER_INFO bi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &bi); //записываем информацию о буфере экрана в консоли в bi
    coord.X = bi.dwCursorPosition.X; //получаем координаты курсора (это будут координаты начала строки после ее вывода)
    coord.Y = bi.dwCursorPosition.Y;
    cout << Input;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); //устанавливаем курсор на ранее полученные координаты
    getline(cin, Input);
    cout << Input;
    return 0;
}

Но к сожалению изменение не сохраняет введенный до этого текст...

Пробовал способ через функцию _getch() библиотеки conio.h, где идет захват символа. Считывание и редактирование строки без стрелок, можно сказать, меня устраивало.

#include <iostream>
#include <conio.h>
constexpr auto BSP = 8;
constexpr auto SPC = 32;
constexpr auto TAB = 9;
constexpr auto ENT = 13;
constexpr auto ESC = 27;
int getstr(char* str, int max) {
    char c;
    int i = 0;
    do {

        c = _getch();
        //_getch();

        switch(c){
        case BSP: if (i != 0) {
            std::cout << "\b \b";
            str[--i] = 0;
        }break;

        case TAB: case ENT: case ESC: {str[i] = 0; return i + 1; }

        default: if (i != max-1) { std::cout << c; str[i++] = c; }
        }

    } while (c != 0);
}

Но при попытке добавить переход по стрелкам я столкнулся с проблемой первичного байта (при нажатии стрелок и некоторых других клавиш идет захват двух значений: первичного байта '\224' и собственно стрелки. Главная проблема в том, что код первичного байта совпадает с кодом символа 'а', что усложняет задачу. Из отдельной простой программы для проверки кодов символов

Только недавно сел за изучение WinAPI, ищу пока решение там. Прошу, подскажите на что мне обратить внимание или возможное решение проблемы первичного байта.


Ответы (0 шт):