#winapi #console #console-application
#winapi #консоль #консоль-приложение
Вопрос:
Я пишу командный интерпретатор, подобный BASH, и
, за которым следует новая строка, подразумевает продолжение входного потока; как я могу реализовать это в Win32?
Если я использую консольный режим с ENABLE_LINE_INPUT
, то пользователь не может нажать обратный пробел, чтобы вернуться к предыдущей строке; Windows запрещает ему это делать. Но если я не установлю ENABLE_LINE_INPUT
, то мне придется вручную переместить курсор, что довольно утомительно, учитывая, что (1) пользователь мог перенаправить входной поток, и что (2) это может быть связано с условиями гонки, и я бы предпочел, чтобы Windows сделала это, если я смогу.
Есть какой-нибудь способ сохранить мою новую строку и использовать ее тоже?
Редактировать:
Если для этого потребуются недокументированные запросы портов CSRSS, то я все еще заинтересован!
Комментарии:
1. Вероятно, это можно сделать, используя версию «Unicode»,
ReadConsole
установивnInitialChars
вpInputControl
параметре.2. @Amigable: Да, я этого боялся… @John: Хм… Я пробовал передавать значение для
pInputControl
вReadConsoleW
как сENABLE_LINE_INPUT
режимом, так и без него, и по-прежнему не видел никакой разницы… :3. Почему самостоятельное позиционирование курсора связано с условиями гонки? Я спрашиваю, потому что на вашем месте я бы пошел по этому пути. Это дает наибольший контроль, но в некотором смысле это должно быть проще в мире Windows, поскольку вам не нужно принимать во внимание огромное количество различных терминалов.
4. @Amigable: Потому что есть проблема, что произойдет, если что-то будет записано в поток, пока я перемещаю курсор назад? Тогда я кое-что перепишу. Также существует проблема с тем, чтобы заставить историю работать с клавишами up / down… это слишком утомительно, чтобы делать все на 100% правильно.
5. code.google.com/p/mintty/issues/detail?id=56#c12 Может быть, интересная информация.
Ответ №1:
Предполагая, что вы хотите, чтобы это запускалось в окне, как по умолчанию выполняется командная строка, а не в полноэкранном режиме, вы могли бы создать приложение с графическим интерфейсом и большим текстовым полем. Пользователи вводили текст в текстовое поле, и вы могли анализировать все, что было введено, и выводить в то же поле (эффективно эмулируя консоль Win32).
Таким образом, любые правила, которые вы хотите установить для поведения консоли, полностью зависят от вас.
Возможно, я ошибаюсь, говоря это, но я полагаю, что консоль Win32 начиная с XP работает точно так же, и она просто прослушивает вывод в стандартном выводе; не должно быть никаких причин, по которым вы не можете сделать то же самое.
Надеюсь, это было полезно.
Комментарии:
1. Спасибо за предложение. К сожалению, как я упоминал в комментарии к своему сообщению,
the entire point of my program was to use the standard Windows terminal, since it integrates well with the rest of the system
во многих отношениях создание текстового поля не было бы эквивалентно этому, потому что это не было бы «родной» консолью (т. Е. Она не была бы распознана ОС как консольное приложение), и я действительно не ищу способ обмануть пользователя и ОС, заставив их думать что-то, что не соответствует действительности. : (2. Затем посмотрите, как работают текстовые редакторы на основе консоли, поскольку, по сути, именно так вам нужно будет принимать команды. Вам придется буферизировать команду и самостоятельно изменять положение курсора, когда вам нужно отследить строку.
3. Да, я боялся, что это может быть ответом… спасибо за помощь.