ENABLE_VIRTUAL_TERMINAL_PROCESSING和DISABLE_NEWLINE_AUTO_RETURN失败

时间:2017-09-04 04:35:01

标签: c++ windows winapi terminal console

关键在于在终端中制作这个小型多人游戏,应用一些基本的图形概念来掌握它的工作原理和背后的数学。

注意我希望这样做很有趣,而且我完全清楚使用终端有更好的选择。

我需要一个可以写入的控制台,所以重点是移除滚动条并将整个缓冲区打印到屏幕上。

但由于字符写入上一行末尾时回车: carriage return

这看起来整体丑陋:

enter image description here

在尝试了大约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( );
}

有了这个结果: Code Result

起初我尝试将其改编为我的项目,但失败了。 然后我感到很沮丧,最后创建了一个新项目,我只是复制粘贴了工作代码。

你猜对了,它不起作用。

not working

现在我已经尝试了很多东西,我已经将我的程序从unicode更改为ansi并返回,并完成了mode = DISABLE_NEWLINE_AUTO_RETURN | ENABLE_VIRTUAL_TERMINAL_PROCESSINGmode |= DISABLE_NEWLINE_AUTO_RETURN | ENABLE_VIRTUAL_TERMINAL_PROCESSING,并且每个单独使用和不使用{{1没有成功。

鉴于它的错误87这意味着错误的参数,我甚至尝试从GetConsoleMode中输入确切的值来查看它是否是句柄,但是因为它起作用,我们可以假设它不是句柄的问题。

基本上在另一台机器上工作的代码对我的不起作用。 另一台机器是windows 10 mine的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正确地做到这一点 docs

我不应该做什么我不是?

对于任何可能已经注意到的拼写/语法错误感到抱歉,感谢您的时间。

1 个答案:

答案 0 :(得分:3)

从Windows 10.0.10586开始,控制台中提供了虚拟终端模式。如果使用ERROR_INVALID_PARAMETER(87)设置模式失败,操作系统不支持它。此外,它仅在新控制台中实现。在Windows 10中选择传统控制台后,启用VT模式可能会成功,但它实际上不会启用VT支持。

Enabling Virtual Terminal Processing示例中,失败案例被错误地记录为“SetConsoleMode以[{1}}返回”(0xC000000D)。作者似乎忽略了STATUS_INVALID_PARAMETER 系统调用(在Windows 8+中)返回的内核状态代码被转换为NtDeviceIoControlFile调用失败并翻译状态代码到Windows API错误代码。