我想了解是否有其他(* 更快 *)的方法使用C# .net将文本输出到控制台应用程序窗口,而不是使用简单的Write,BackgroundColor和ForegroundColor方法和属性?我了解到每个单元格都有一个背景色和一个前景色,我希望缓存/缓冲/写入比使用上述方法更快。
也许使用Out缓冲区会有一些帮助,但我不知道如何将颜色编码到流中,如果那是颜色数据所在的地方。
这是一个复古的基于文本的游戏,我想实现我利用标准的颜色和ASCII字符布局的游戏。
请帮帮忙:)
更新:
输出和缓冲区可能不是我需要搞砸的。似乎有一个屏幕缓冲区是由控制台拥有的。我不知道如何访问它,也许我只是运气不好,除非我进口一些dll。
3条答案
按热度按时间unguejic1#
**更新:**新增了一个示例
如果你准备做一些P/Invoke的事情,这可能会有所帮助。
基本上,如果你得到一个控制台缓冲区的句柄,那么你可以使用标准的Win32 API来操纵缓冲区,甚至在屏幕外构建整个缓冲区并将其blit到控制台。
唯一棘手的部分是获取控制台缓冲区的句柄。我没有在.NET中尝试过,但是在过去的几年里,你可以通过使用CreateFile(你需要P/Invoke this)获得当前控制台的句柄,然后打开“CONOUT$”,然后你可以使用返回的句柄传递给其他API。
P/调用CreateFile
http://www.pinvoke.net/default.aspx/kernel32/CreateFile.html
您可以使用WriteConsoleOutput将所有字符及其属性从内存缓冲区移动到控制台缓冲区。
http://msdn.microsoft.com/en-us/library/ms687404(VS.85).aspx的
您可能会创建一个很好的库来提供对控制台缓冲区的低级别访问。
由于我正试图让我的.NET再次达到标准,我想我会尝试我的手在这方面,看看我是否可以让它工作。下面是一个示例,它将用所有字母A-Z填充屏幕,并遍历所有forground属性0-15。我想你会对表演印象深刻的。老实说,我没有花太多时间检查这段代码,所以错误检查是零,这里或那里可能有一个小bug,但它应该让你继续使用其余的API。
字符串
Unicode示例
型
bvjveswy2#
如果你看一下
Console
属性的实现来改变控制台颜色,它们委托给kernel32.dll
的SetConsoleTextAttribute方法。此方法将字符属性作为输入来设置前景色和背景色。在几个MSDN文档页面中,每个屏幕缓冲区(控制台中有一个)都有一个字符信息记录的二维数组,每个都用CHAR_INFO表示。这就是每个字符的颜色。您可以使用
SetConsoleTextAttribute
方法来操作此操作,但这适用于写入控制台的任何新文本-您不能操作控制台上已有的文本。除非控制台文本颜色属性中有一个较低级别的钩子(这看起来不太可能),否则我认为您会使用这些方法。
您可以尝试的一件事是创建一个新的屏幕缓冲区,写入该缓冲区,然后使用SetConsoleActiveScreenBuffer将其切换为控制台的当前缓冲区。这 * 可能 * 会产生更快的输出,因为您将所有输出写入到一个不活动的缓冲区。
mkshixfv3#
我成功地使用了
字符串
但如果有人能告诉我如何写扩展ASCII到这个我会很感激