重点是在terminal上制作这个小型的多人游戏,运用一些基本的graphics概念来掌握它是如何工作的,以及它背后的math。
注意我希望这样做是为了好玩,而且我完全意识到使用terminal有更好的select。
我需要一个我可以写的控制台,所以重点是删除滚动条,并将整个缓冲区打印到屏幕上。
但是由于字符被写入到上一行的末尾时的回车符:
这看起来总体上很丑陋:
在尝试了大约3个小时之后,通过SetConsoleMode来完成这个工作,我问了一个不和谐的问题。
我得到的答案是这样的:
void main( ) { auto h = GetStdHandle( STD_OUTPUT_HANDLE ); DWORD mode = 0; GetConsoleMode( h, &mode ); mode |= DISABLE_NEWLINE_AUTO_RETURN | ENABLE_VIRTUAL_TERMINAL_PROCESSING; puts( SetConsoleMode( h, mode ) ? "Win" : "Loss" ); char * buf = new char[ 200*2 ]; memset( buf, 0, 200*2 ); memset( buf, 'A', 120*2 ); std::cout << ( buf ); getchar( ); }
有了这个结果:
起初我试着把它适应到我的项目,失败了。 然后我感到沮丧,并最终创build了一个新的项目,我刚刚复制粘贴工作代码。
而你猜对了,这是行不通的。
现在我已经尝试了相当多的东西,我已经把我的程序从unicode更改为ansi并返回,并且完成了mode = DISABLE_NEWLINE_AUTO_RETURN | ENABLE_VIRTUAL_TERMINAL_PROCESSING
mode = DISABLE_NEWLINE_AUTO_RETURN | ENABLE_VIRTUAL_TERMINAL_PROCESSING
, mode |= DISABLE_NEWLINE_AUTO_RETURN | ENABLE_VIRTUAL_TERMINAL_PROCESSING
mode |= DISABLE_NEWLINE_AUTO_RETURN | ENABLE_VIRTUAL_TERMINAL_PROCESSING
,每个单独有和没有|
没有成功。
鉴于它是错误87,这意味着不好的参数,我甚至尝试把从GetConsoleMode确切的价值,看看它是否是句柄,但因为它的工作,我们可以认为这不是句柄的问题。
基本上在另一台机器上工作的代码不适用于我的。 另一台机器是Windows 10我的8.1都是64。
在两台机器上,第一次GetConsoleMode的值是3,这意味着ENABLE_PROCESSED_OUTPUT和ENABLE_WRAP_AT_EOL_OUTPUT。
我的项目上的Windows SDK版本是10.0.15063.0,带有Visual Studio 2017(v141)的平台工具集。
我一整天都没有成功。 现在,这不是我第一次阅读一些重要的细节,但我一直在通过文档,并没有提到使用ENABLE_VIRTUAL_TERMINAL_PROCESSING SetConsoleMode的失败。
据我所知,我正在做的基于Docs正确
我应该做什么,我不是?
对不起,可能已经注意到任何拼写/语法错误,并感谢您的时间。
虚拟终端模式在Windows 10.0.10586开始的控制台中可用。 如果使用ERROR_INVALID_PARAMETER
(87)设置模式失败,则操作系统不支持该操作。 而且,它只在新的控制台中实现。 在Windows 10中选择旧式控制台后,启用VT模式可能会成功,但实际上不会启用VT支持。
在启用虚拟终端处理示例中,失败情况被错误地记录为“ SetConsoleMode
与STATUS_INVALID_PARAMETER
返回”(0xC000000D)。 看来作者忽略了由NtDeviceIoControlFile
系统调用 (在Windows 8 +中)返回的内核状态代码被转换为失败SetConsoleMode
调用并将状态代码转换为Windows API错误代码。