在 windows 控制台中排队
Posted
技术标签:
【中文标题】在 windows 控制台中排队【英文标题】:Go line up in windows console 【发布时间】:2014-06-19 13:39:39 【问题描述】:您似乎可以使用\b
在控制台中从当前行返回一个字符。但是,控制台似乎无法跳出一行。
我想将无效的用户输入标记为红色。键入输入后,用户按 Enter 将不可擦除的新行放入控制台。
我的计划是做以下事情:
-
检查
input
的有效性。
如果无效,打印input.length()+1
次\b
将控制台颜色变为红色
打印input
,打印\n
但是,\b
不会跳回到用户输入所在的行。所以我有B计划:
-
记住用户输入之前的字符串长度 (
query_string
)
检查input
的有效性。
如果无效,就去排队(输入的地方)
跳转到query_string.length()
字符
将控制台颜色变为红色
打印input
,打印\n
但是,我不知道如何使用 console API 来做到这一点。
【问题讨论】:
SetConsoleCursorPosition
。当我在做的时候,SetConsoleTextAttribute
【参考方案1】:
至少有两种方法可以做到这一点。
正如@chris 在评论中暗示的那样,一种方法是保存用户开始输入的光标位置。当您发现输入错误时,您将光标设置回该位置并更改他输入的字符的文本属性。
您可能不想将窗口向后滚动一行。如果你这样做了,那么当用户出错时,窗口就会出现“跳跃”。这是一个非常不和谐的用户界面体验。不过如果你想试试,可以拨打ScrollConsoleScreenBuffer。
另一种方法是change the console mode,这样它就不会在用户键入字符时自动回显字符。相反,您单独读取每个字符,将其附加到输入缓冲区,并在用户按下 Enter 时验证。如果输入有效,则发出换行符以移至下一行。否则,您将备份并突出显示错误的输入。这听起来需要做更多的工作,但并不难,而且会带来更好的 UI 体验。
【讨论】:
以上是关于在 windows 控制台中排队的主要内容,如果未能解决你的问题,请参考以下文章
40 windows_40_Thread_Mutex 线程 - 互斥
如何在 Rails 控制台中运行 ActiveJob 进行调试?