Меню Рубрики

Установка курсора в консоли

Функции API для работы с консолью

Для начала работы с консолью необходимо получить ее дескриптор.

Функция получения дескриптора стандартного устройства ввода, вывода или ошибки в зависимости от переданного константного параметра:
HANDLE WINAPI GetStdHandle(__in DWORD nStdHandle);

nStdHandle может принимать значения

  • STD_INPUT_HANDLE = -10; // устройство ввода
  • STD_OUTPUT_HANDLE = -11; // устройство вывода
  • STD_ERROR_HANDLE = -12; // ошибка

Использование русского языка в консоли с помощью API

Для указания кодовой страницы используются функции

  • Кодовая страница консоли вывода
    BOOL WINAPI SetConsoleOutputCP(UINT wCodePageID);
  • Кодовая страница консоли ввода
    BOOL WINAPI SetConsoleCP(UINT wCodePageID);

где wCodePageID — номер кодовой страницы.
Для перекодировки на русский язык используется кодовая страница wCodePage >.

Для перекодировки русского текста, введенного в Win-коде также может использоваться функция

  • lpszSrc – указатель на строку-источник;
  • lpszDst/strong> – указатель на строку-приемник

Возвращаемое значение 1 в случае успешной перекодировки.

Чтение/запись данных в консоль/файл

Для чтения и записи данных в консоль используются функции

В случае успешного завершения функции возвращают ненулевое значение.
Аргументы функций

  • hFile -дескриптор файла/консоли. Файл/консоль должен иметь доступ для чтения для функции ReadFile() и доступ для записи для функции WriteFile() .
  • lpBuffer — указатель на буфер (строку) для чтения/записи данных.
  • nNumberOfBytesToWrite — число байтов, которые будут записаны в файл.
  • lpNumberOfBytesWritten — указатель на переменную, которая получает число считанных/записанных байтов.
  • lpOverlapped — указатель на структуру OVERLAPPED , которая используется в операциях асинхронного ввода-вывода (например, получение данных по интерфейсу связи). Для синхронного ввода-вывода данный указатель имеет значение NULL .

Установка заголовка окна консоли

Функция установки заголовка окна консоли

lpConsoleTitle – указатель на строку имени консоли с завершающим нуль-символом

Установка цвета символов и фона в консоли

Цвет символов и фона задается с помощью констант, определяющих тетрады символов.
Цвет символов

  • FOREGROUND_BLUE = 0x01
  • FOREGROUND_GREEN = 0x02
  • FOREGROUND_RED = 0x04
  • FOREGROUND_INTENSITY = 0x08
  • BACKGROUND_BLUE = 0x10
  • BACKGROUND_GREEN = 0x20
  • BACKGROUND_RED = 0x40
  • BACKGROUND_INTENSITY = 0x80

Каждая тетрада, определяющая цвет символов или фона, представляет собой значение от 0 до 15, задаваемая логической суммой соответствующих констант:

Например, цвет символов с кодом 13 задается как

FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY .

Функция определения атрибутов вводимых символов в окне консоли

  • hConsoleOutput – дескриптор буфера консоли вывода;
  • wAttributes – цвет букв и фона, получаемый путем комбинации констант

Функция, задающая цвет фона консоли(путем закрашивания фона отдельных символов)

  • hConsoleOutput – дескриптор буфера вывода консоли;
    wAttribute – атрибут цвета фона символа в консоли;
  • nLength – количество ячеек символов, фон которых устанавливается заданным цветом;
  • dwWriteCoord – координаты первой закрашиваемой ячейки;
  • lpNumberOfAttrsWritten – указатель на идентификатор, в который записывается количество реально закрашенных ячеек.

Для того чтобы изменить цвет всего окна консоли необходимо задать цвет символов, количество которых определяется размером окна консоли. Размер стандартного окна консоли 80×25 = 2000 символов.

Установка позиции курсора

Функция установки позиции курсора в окне консоли

hConsoleOutput – дескриптор буфера вывода консоли;
dwCursorPosition – структура координат COORD, определяющая позицию курсора.

Структура координат представляет собой

Результат выполнения

Примечание: для корректной компиляции программы необходимо изменить тип кодировки проекта на многобайтовую.

источник

Перемещение курсора в консоли

Работаю над матричным калькулятором в консоли. Для оформления ввода матрицы надо, чтобы после ввода элемента, число считывалось, а курсор не переходил на следующую строку, а оставался там же. Получилось сделать, используя команду system(«cls») после ввода элемента, но тогда приходится выводить на экран все, что было стерто до этого. Нет ли более простых способов перевести курсор назад?

Перемещение курсора в консоли
Помогите реализовать новичку перемещение курсора в консоли.Т.е. есть меню например Создать базу.

Перемещение позиции курсора в консоли
Приветы форумчанам, вопрос такой. Нужно переместить позицию курсора на произвольную позицию в.

Перемещение курсора
Подскажите как передвинуть курсор в любую точку экрана по координатам x и y. Или каким нибуд другим.

Перемещение курсора
Мне нужно сделать что-то типа интерфейса на консоли.Как задавать координаты курсора на консоли в.

Понятия не имею, что такое матричный калькулятор.

Да, использование функции system() — в принципе штука затратная. Однако, если вам надо ввести с консоли два десятка значений — глубоко наплевать на «затратность». Здесь скорее мерцание консоли при перерисовке раздражает.

А вообще, всё зависит от ваших потребностей. Просто некоторые вещи реализовать мимо консольного API Винды не получится.

Ений_В, привет!
Вызывай функцию gotoxy(int, int) и передавай ей высчитанные координаты нужного положения курсора в консоле (x — от левого края по горизонтали, y — от верха окна консоли по вертикале). Курсор можно передвинуть в любое место с помощью этой функции.

Решение

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

перемещение курсора в файле
как мне после первого цикла вернуть курсор в начала файла out? fseek ругает то, что первый элемент.

Перемещение курсора в файле
Здравствуйте! Пишу программу, где работаю с файлом с помощью потока, и понадобилось переместить.

Читайте также:  Установка закабинных спальников на грузовики

Смещение курсора по консоли
Всем привет! Я работаю в программе dev c++. И мне нужна помощь,чтобы определенный символ я смог.

Координаты курсора в консоли
Существует аналог функции паскалевской GoToXY(x,y) — перемещает курсор по заданным координатам.

источник

Как установить положение курсора консоли для стандартного вывода

Я хочу установить позицию курсора для печати char на экране консоли. Есть ли решение без использования ncurses библиотека.

Есть ли эквивалентный вызов для SetConsoleCursorPosition в линуксе из пример ниже:

Решение

Возможно, немного истории в порядке. То, что вы называете «консолью» в Windows, на самом деле является примером эмулятора терминала; однако, в отличие от традиционных эмуляторов терминала, Windows обеспечивает прямой доступ к терминалу через консольный API. Традиционный подход, используемый терминалами (и, следовательно, эмуляторами терминалов), заключался в интерпретации escape-последовательности, каждый из которых инструктирует терминал выполнить некоторую операцию.

К сожалению, как вы можете себе представить, возможности терминалов сильно различались (некоторые могли даже рисовать графику того или иного вида), и поэтому не все терминалы используют один и тот же набор escape-последовательностей. В эти дни вам очень не повезло бы столкнуться с чем-то, что не реализовывало бы надмножество ANSI / VT100 убегает ; если вы рады, что поддерживает только ANSI / VT100 и производные, вы можете отправить ESC [ n ; m H , где N номер строки и м номер столбца.

Однако если вы делать сделать это, ваш код не будет работать, если он представлен с чем-то экзотическим. В этом случае вам действительно стоит подумать об использовании библиотеки curses (ncurses — распространенный, но не единственный пример), даже если вы используете ее только для извлечения информации из базы данных terminfo (хотя я настоятельно рекомендую просто использовать curses библиотека).

Наконец, примечание: код, который вы цитируете из Windows, не обязательно будет работать (!) Почему? Так как printf() выполняет буферизованный вывод, и нет никакой гарантии, что ваш персонаж будет отправлен на консоль, прежде чем вы снова измените положение курсора. Вы можете исправить это, используя fflush(stdout) , но если честно, если вы используете SetConsoleCursorPosition Вы также можете просто использовать WriteConsole и покончим с этим.

Дополнительная полезная информация

Вы можете получить версию проклятий, которая работает в Windows; см. например PDCurses . Если бы вы использовали проклятия, вам бы не понадобился какой-либо специфичный для Windows код, а также Вы будете работать на любом терминале, который использовался.

источник

Оформляем консольное приложение

Некоторые приемы по управлению цветом и позиционированием текста в консольных приложениях как в DOS/Windows, так и в UNIX.

Многие считают, что консольная программа может выглядеть лишь черно-белой и невзрачной, «радуя» пользователя только сухими строчками текста. В лучшем случае при выводе табличных данных они более-менее выравниваются и обрамляются псевдографикой из плюсов-минусов (кстати, так же делали при печати таблиц на пишущих машинках в докомпьютерную эпоху). Между тем не так давно, когда Windows и Mac еще не приучили мир к графическому интерфейсу, программы отлично рисовали цветные таблички-окошки безо всякой графики. До сих пор вы можете найти такие программы, например, широко распространенный файловый менеджер Far, один из последователей знаменитого Norton Commander. Более того, некоторые программы (например текстовая версия Norton Utilities) создавали «почти графический» интерфейс, заменяя таблицу символов видеоадаптера и даже делая это «на лету» для вывода полноценного графического курсора мыши. Я не буду рассматривать последний случай (скорее всего, для написания графического приложения вы будете использовать графическую платформу, например Windows), а вот о том, как красиво оформить консольное приложение, пару слов скажу.

Для начала раскрасим стандартный черно-серый экран. Если вы используете обычный вывод в консоль (например, в C это функции семейства printf), то предпочтительный способ управления цветами зависит от платформы, под которую разрабатывается приложение. Если это UNIX, то самым простым и естественным способом установки цвета, а также и позиционирования курсора, будут ESC-команды. Это последовательности символов, начинающиеся с комбинации «\x27[» ( \x27 – это и есть код символа ESC), за которой следуют параметры через запятую. Здесь и далее все справочные материалы вынесены во всплывающие окна. Вот таблица ESC-последовательностей для управления курсором и цветами выводимого текста.

Везде в тексте ESC обозначает символ с кодом 27 (0x1B), буквы x , y , n – переменные, значения которых записываются в десятичной форме.

ESC[y;xH или ESC[y;xf – переместить курсор в позицию (x,y).

ESC[yA – переместить курсор на y строк вверх.

ESC[yB – переместить курсор на y строк вниз.

ESC[xC – переместить курсор на x символов вправо.

ESC[xD – переместить курсор на x символов влево.

ESC[nm или ESC[n;nm ESC[n;n;nm – установить атрибуты вывода текста. Список атрибутов следующий:

Атрибут Значение n
Установить атрибуты по умолчанию
Полужирный шрифт 1
Подчеркнутый шрифт 4
Черный цвет символов 30
Красный цвет символов 31
Зеленый цвет символов 32
Желтый цвет символов 33
Синий цвет символов 34
Малиновый (magenta) цвет символов 35
Бирюзовый (cyan) цвет символов 36
Белый цвет символов 37
Черный цвет фона 40
Красный цвет фона 41
Зеленый цвет фона 42
Желтый цвет фона 43
Синий цвет фона 44
Малиновый (magenta) цвет фона 45
Бирюзовый (cyan) цвет фона 46
Белый цвет фона 47
Читайте также:  Установка газовых форсунок приора

ESC-последовательности можно использовать и в Windows-консоли, но для этого потребуется специальный драйвер ansi.sys, который может быть и не установлен у пользователя вашей программы. Поэтому для приложения под Win32 лучше использовать функции, специально предназначенные для оформления вывода в консоль. Функция SetConsoleTextAttribute позволяет установить цвета и другие атрибуты (например, подчеркивание), а функция GetConsoleScreenBufferInfo — получить текущие значения атрибутов и различные другие параметры. Принцип установки атрибутов очень прост: все символы, выведенные после вызова SetConsoleTextAttribute будут иметь установленные атрибуты. Устанавливаете нужные цвета, печатаете текст этими цветами, устанавливаете цвет следующей порции текста, выводите его, и так далее. Подробное описание этих функций доступно в MSDN (щелкните по имени функции), я его не буду повторять, а сразу приведу пример использования, из которого будет все понятно.

Позиционирование

Теперь рассмотрим способы, которыми можно нарушить стандартный порядок «слева-направо сверху-вниз» вывода данных в консоль. Сразу замечу, что как только вы начинаете использовать позиционирование при выводе, результат работы программы будет, скорее всего, непригоден для перенаправления в файл. Если раскраска при выводе в файл будет просто проигнорирована (при использовании ESC-последовательностей они останутся в файле, но зато вы сможете просто вывести файл на консоль и весь текст будет вновь раскрашен, как при работе программы), то позиционирование приведет к тому, что вывод на экран и текст в файле будут отличаться друг от друга, возможно очень сильно. Но в любом случае, знать некоторые приемы не помешает.

Прием первый: динамическая строка.

Пока вы не перевели строку при выводе, ее содержимое можно активно менять. Этим, например, можно пользоваться для отображения прогресса какой-либо длительной операции. Для изменения содержимого строки можно поступить двумя путями.
Первый: удаляем выведенные символы с помощью символа «backspace» с кодом 8. Он возвращает курсор на одну позицию назад, символ, правда, не стирает, но позволяет записать другой поверх. В этом случае нужно точно считать число выведенных символов, чтобы всегда знать позицию курсора.
Второй: вернуться к началу строки и напечатать новую. Для возврата к началу строки БЕЗ перехода на новую, используйте символ «CR» (Carrige Return) с кодом 13 (0x0C). После этого напечатайте новую строку, заведомо длиннее уже выведенной, чтобы затереть все старые символы (если вы не хотите добиться специальных эффектов, обновляя только начало строки).

Прием второй: прямое управление курсором

В случае UNIX-приложения можно использовать уже описанные в разделе про цвет ESC-последовательности. Windows же предоставляет две функции для управления курсором в консоли: SetConsoleCursorPosition позволяет установить позицию курсора, а GetConsoleScreenBufferInfo позволяет получить текущие координаты курсора, размер консоли, положение видимой области (если включена прокрутка) и другие атрибуты. Обе эти функции используют дескриптор консоли, процесс получения которого уже был рассмотрен выше. Как и раньше, ограничусь примером.

Рисование линий и рамок

Чтобы придать выводимому тексту красивый и законченный вид, можно использовать рамки. Особенно уместно они выглядят при выводе табличных данных, однако их можно использовать и для оформления ввода данных (приглашение и поле для ввода оформить в рамку), а при желании можно создать собственную псевдографическую оконную библиотеку (вспомним TurboVision и его многочисленные аналоги, столь популярные лет 10-15 назад). Псевдографику можно использовать и совсем нетрадиционным способом, как это сделано, например, в моем анализаторе COM-порта. Рамки и линии рисуются с помощью набора из 40 символов, 4 из которых являются прямыми линиями (вертикальные/горизонтальные, одинарные и двойные), а оставшиеся 36 – уголками и соединениями между ними во всех возможных комбинациях. Ниже приведена таблица всех этих символов в двух кодировках: CP866 (консоль DOS/Windows – верхняя строка) и KOI-8R (нижняя строка). Первой пользуемся в Windows, второй в UNIX. Числа в шестнадцатеричном представлении, префиксы (типа \x или 0x) опущены для краткости.

Таблица символов псевдографики в кодировках CP866 (DOS) и KOI8-R

Для проверки вы можете воспользоваться простой программой на PHP, которая выводит такие же рамки, как те, что изображены выше. Первая половина вывода рассчитана на DOS-консоль, вторая на UNIX в кодировке KOI8-R.

источник

Как получить / установить положение курсора консоли в Ruby (Windows)

Я пытаюсь написать shell в Ruby, и для реализации завершения табуляции я использую функцию WinAPI getch для чтения символа за раз от пользователя, проверяя вкладки.

Проблема с этим-клавиша backspace :

  1. Он перемещает курсор дальше назад, чем приглашение (например, с приглашением hello> пользователь может вернуть курсор на h . Я бы хотел, чтобы он остановился на последнем пространстве.
  2. Когда текст пользователя перетекает на следующую строку консоли, backspace не перемещается обратно на предыдущую строку.
Читайте также:  Установка прицела на ласточкин хвост проблемы

(Я знаю, что оба эти поведения являются преднамеренными.)

Мое воображаемое решение этих проблем включает в себя управление движением курсора; мне нужно знать, где находится курсор, и иметь возможность перемещать его.

На Linux я бы использовал escape-последовательности ANSI, но они не поддерживаются консолью Windows.

Я заглянул в WinAPI и попытался найти функции, которые позволили бы мне это сделать, но все, что я мог найти , — это функция GetConsoleCursorInfo , которая возвращает только размер и видимость курсора.

Примеры были бы оценены, поскольку я безнадежен в использовании класса Win32API для чего-либо, кроме примитивных функций.

3 Ответа

Возможно, вам лучше использовать readline. Он включен в программу установки Ruby One-Click. Основная настройка-это:

У вас уже есть стандартные функции чтения строк, такие как backspacing, Alt+backspace для удаления слова, истории и завершения вкладки. Здесь есть хорошая документация о том, как настроить его для ваших нужд .

Редактировать:

Если у вас не установлен readline, вы можете получить его и другие внешние библиотеки здесь . Вам понадобится пакет readline-4.3-2-mswin32 . Скопируйте файл readline.dll (расположенный в каталоге bin ) в ваш каталог ruby\bin . Этого должно хватить.

Хотя это не задокументировано на главной странице Ruby, похоже, что вы также можете использовать readline 5, доступный здесь . В частности, вам нужно распределение двоичных файлов. Скопируйте readline5.dll (в каталоге bin ) в каталог ruby\bin и переименуйте его в readline.dll .

Кроме того, в качестве дополнительного замечания, Не пугайтесь, если require ‘readline’ возвращает false при использовании irb, так как он, по-видимому, предварительно загружает его.

Хм, конечно, можно создать резервную копию, и с достаточно портативным кодом, так как bash(1) может создать резервную копию до предыдущей строки даже в коробке dos. Я предполагаю, что он использует termcap или ncurses ,и у него есть в базе данных termcap набор управляющих кодов, которые работают для коробки dos.

В Ruby я не верю, что существуют какие-либо привязки termcap, поэтому вы используете ncurses, а не вводите в свою программу набор зависимых от устройства управляющих кодов. (Вы все равно хотели бы получить ncurses над termcap.)

Как только вы переключитесь на ncurses, я думаю, что вы найдете элементы API, чтобы сделать все, что вам нужно, включая резервное копирование строк и не перезаписывать приглашение. (И, конечно же, вы не должны создавать резервные копии над тем, что вы не выводили с самого начала, независимо от того, какая библиотека используется.)

Вообще-то, мне нравится ответ песто. Используйте ncurses, если readline не работает или если вам нужна адресация курсора по какой-то другой причине.

Для реализации windows-дружественной строки чтения попробуйте эту ruby-основанную строку чтения

Похожие вопросы:

Как я могу установить / получить положение курсора в JavaFX 2? Я устал гуглить ответ, но не нашел ничего полезного. Все, что я могу сделать, это установить стиль курсора.

Я разрабатывал приложение для удаленного рабочего стола, которое работает как служба Windows, и мне было интересно, как я могу подключить приложение к определенному сеансу и позволить ему получить.

Я хочу знать, как получить положение курсора на Windows в c++, Причины: я пытаюсь переместить положение мыши по координате X Y с информацией на экране например: я хочу установить положение мыши в.

Я пытаюсь поместить простую консоль spinner в мое приложение scala, но я не уверен, как установить положение курсора? Если это невозможно, есть ли другой способ достичь этого?

Как узнать положение курсора blink в windows, из c++? Во многих случаях мне нужно нажать кнопку отправки на положение мигающего курсора, но я не нашел какой-либо важной функции, которая позаботится.

Я нашел много статей о том, как установить положение мыши в проекте C# windows forms — я хочу сделать это в консольном приложении. Как я могу установить абсолютное положение мыши из консольного.

добрый день Если это вывод консоли: . . . . Hello World! Я хотел бы установить положение курсора, скажем, 20 строк из последней строки текста. Как бы я это сделал в случае, если последняя строка.

В моем плагине vim я получаю текущую позицию курсора, используя Ruby w.cursor . Номер столбца, который он мне дает, основан на tabsize 1. E.g. если текущая строка имеет значение \t\tfoo , а курсор.

Я знаю, что BASIC-это устаревший язык, но с ним весело играть. Я использую FreeBASIC на Windows и пытаюсь заново скомпилировать старую программу, которую я изначально написал для Apple ][. Одна из.

Я хочу установить положение курсора для печати char на экране консоли. Есть ли решение без использования библиотеки ncurses ? Есть ли эквивалентный вызов для SetConsoleCursorPosition в Linux из.

источник