2012-04-13 49 views
0

我正在构建.NET 4.0控制台应用程序,它不断地(通常每隔几秒)写出一个控制台。这是一个多线程应用程序,不同的线程在不同的时间写入控制台。在.NET中同时读写控制台

问题是我想在所有这些都发生时接受用户输入。用户输入可能随时发生。

我试过两种不同的方法,但都不能很好地工作。

  1. 我试着用一个单独的线程通过寻找Console.KeyAvailable来阅读。这个“工作”,但真是令人困惑,因为字符串正在写入输出,当你试图输入。这使得光标在打字时四处移动,迷惑不解。

  2. 我试着用Console.SetCursorPosition把控制台分成两个“窗格”。输出顶部并在下面输入。这也有效,但每次绘制屏幕后我都必须调用Console.Clear()。这很慢,导致屏幕闪烁闪烁。

这似乎是我唯一的其他选择是编写Windows窗体应用程序或WPF应用程序来模拟控制台。这似乎很荒谬,因为我唯一想做的事情就是接受自发的用户输入。

我的谷歌福没有露面任何有效的控制台替换或任何人谁​​曾建立一个模拟控制台一个.net应用程序....

难道我坚持在这里?

+0

你能不能 '暂停' 在按键后的输出?您可以决定暂停持续的时间 – Jared 2012-04-13 21:51:28

回答

1

这是可能的,但很难。这不是我推荐尝试的东西。您必须创建您设置的自定义TextWriterConsole.SetOut)。 TextWriter会在控制台窗口底部留下一行或两行供您用于写入。你最终不得不自己滚动窗口,自己定位光标,等等。你还必须担心包装线和所有腐烂。这是...疯狂。

如果你想玩它,你需要熟知Console API,以及它的.NET包装。几年前我发布了一个.NET包装器。你可以用这个包装来做所有的事情。你可以从http://mischel.com/pubs/consoledotnet.zip

下载封套我写了三篇关于它的文章,其中两篇仍然可用。见

http://www.devsource.com/c/a/Using-VS/Working-with-Console-Screen-Buffers-in-NET/

http://www.devsource.com/c/a/Using-VS/Console-Input-in-NET/

+0

Dang,尽量多,但它确实很好。这是一个很棒的图书馆,但为了简单起见,我想现在就让这个要求去做。如果我需要回来,我可能会使用该库。谢谢! – Onisemus 2012-04-17 15:30:09

0

如何有2个控制台窗口?一个用于输入,另一个用于输出。您可以使用WinApi创建控制台窗口。

+0

“一个进程最多可以连接到一个控制台。” http://msdn.microsoft.com/en-us/library/windows/desktop/ms681952(v=vs.85).aspx – 2012-04-13 23:32:20