ENABLE_VIRTUAL_TERMINAL_PROCESSING和DISABLE_NEWLINE_AUTO_RETURN失败

重点是在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_PROCESSINGmode |= 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支持。

在启用虚拟终端处理示例中,失败情况被错误地记录为“ SetConsoleModeSTATUS_INVALID_PARAMETER返回”(0xC000000D)。 看来作者忽略了由NtDeviceIoControlFile 系统调用 (在Windows 8 +中)返回的内核状态代码被转换为失败SetConsoleMode调用并将状态代码转换为Windows API错误代码。