关键在于在终端中制作这个小型多人游戏,应用一些基本的图形概念来掌握它的工作原理和背后的数学。
注意我希望这样做很有趣,而且我完全清楚使用终端有更好的选择。
我需要一个可以写入的控制台,所以重点是移除滚动条并将整个缓冲区打印到屏幕上。
这看起来整体丑陋:
在尝试了大约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( );
}
起初我尝试将其改编为我的项目,但失败了。 然后我感到很沮丧,最后创建了一个新项目,我只是复制粘贴了工作代码。
你猜对了,它不起作用。
现在我已经尝试了很多东西,我已经将我的程序从unicode更改为ansi并返回,并完成了mode = DISABLE_NEWLINE_AUTO_RETURN | ENABLE_VIRTUAL_TERMINAL_PROCESSING
,mode |= 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正确地做到这一点
我不应该做什么我不是?
对于任何可能已经注意到的拼写/语法错误感到抱歉,感谢您的时间。
答案 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错误代码。