如何在多线程控制台中保留一行输入?
这个问题已经困扰我一段时间了,我意识到很难描述我在寻找什么。我希望能够在 C# 控制台应用程序中保留一行用于文本输入,同时仍然允许在剩余行中更新其他信息。更具体地说,我想制作一个小型泥浆游戏,即使用户忙于输入,游戏也会更新。输入不会阻塞信息流,这一点很重要。
我想实现用户将输入写入屏幕中最后一个可见行的效果,而其他文本照常追加,但不向下滚动我的输入行,也不覆盖它。
如果我用表单来描述这一点,我会想象相当于有一个多行文本框作为信息的上部,在底部有一个单行文本框作为输入。
This question has bugged me for a while now, and I realize it's hard to describe what I am looking for. I want to be able to reserve a row for text input in a C# Console Application, while still allowing other information to be updated in the remaining rows. More specifically, I'd like to make a small mud game where the game is updated even while the user is busy making input. It's important that the input doesn't block the information flow.
I'd like to achieve the effect of the user writing input to the last visible row in the screen, while the other text append as usual, but not scrolling down my line of input, nor overwrite it.
If I would describe this in terms of Forms, I'd imagine the equivalent of having a multi-line textbox as the upper portion for the information, with a single-line textbox at the bottom for the input.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
查看这些curses 的.NET 绑定
http://www.mono-project.com/Libraries#Curses
ncurses 显然是 UNIX 的发明,但据说其 API 大多是跨平台的(我自己没有尝试过 .NET 绑定,但总体上使用 ncurses 取得了非常好的结果)。
这绝对包含您需要的商品以及更多
Look at these .NET bindings for curses
http://www.mono-project.com/Libraries#Curses
ncurses is obviously a UNIX invention, but the API's are said to be mostly cross-platform (I haven't tried the .NET bindings myself, but have had very good results working with ncurses in general).
This will absolutely contain the goods you need and more
您可以尝试的一种选择是直接操作控制台缓冲区来渲染游戏区域,并使用 Console.SetCursorPosition 将光标定位到输入行,例如使用 Console.ReadLine 来获取用户输入。
由于对缓冲区的直接操作不会影响光标位置并且独立于控制台读/写功能,因此您可以使用线程更新控制台缓冲区,该缓冲区覆盖前 24 行,第 25 行正在等待输入。如果我有时间,我会尝试整理一个我的意思的示例,但与此同时,您可以参考我提供的其他答案,以获取直接写入控制台缓冲区的指针。
如何将快速彩色输出写入控制台? < /一>
<一href="https://stackoverflow.com/questions/3173750/deleting-previously-writing-lines-in-console/3174089#3174089">删除控制台中以前写入的行
当然,你会想写一些很好的包装函数使这很容易使用,我总是考虑这样做,我只是没有在控制台上做足够的工作,所以我实际上坐下来做点什么。
更新:添加了一个在线程中更新控制台的小示例,同时仍然接受用户输入。只需输入“quit”即可停止运行。请注意,ConsoleBuffer 类并不理想,我没有关闭控制台句柄,它只是演示的一段快速代码。
One option that you could try, is to directly manipulate the console buffer to render your game area and use the Console.SetCursorPosition to position the cursor to the input line where you use Console.ReadLine for example to take the user input.
Since the direct manipulation of the buffer does not affect the cursor position and is independent of the Console Read/Write functionality you can have a thread updating the Console buffer which covers the first 24 lines and the 25 line is waiting for input. If I get some time I will try put together a sample of what I mean, but in the meantime you can reference the other answers I have provided for a pointer to writing directly to the Console buffer.
How can I write fast colored output to Console?
Deleting previously written lines in Console
Of course you will want to write some nice wrapper functions to make this easy to work with, I always think about doing this, I just don't do enough work with the console so that I actually get down and do something.
Update: Added a small example of updating the console in a thread while still accepting user input. Just type 'quit' to stop it running. Note the the ConsoleBuffer class is not ideal, I am not closing the console handle, it was just a quick piece of code for the demo.
dotNet 控制台支持
SetCursorPosition()
,并且您还可以使用旧的 DOS 技巧,以\r
而不是\n\r
结束行。但多线程和 Append 听起来并不是一个好的组合。
The dotNet Console supports
SetCursorPosition()
and you also use the old DOS trick of ending a line with\r
instead of\n\r
.But multi-threading and Append doesn't sound like a good combination.