【发布时间】:2018-02-12 07:04:56
【问题描述】:
重点是在终端中制作这款小型多人游戏,应用一些基本的图形概念来掌握它的工作原理和背后的数学原理。
请注意,我希望这样做是为了好玩,并且我完全清楚使用终端有更好的选择。
我需要一个可以写入的控制台,所以重点是移除滚动条并将整个缓冲区打印到屏幕上。
这看起来整体很难看:
在通过 SetConsoleMode 尝试了大约 3 小时后,我不和谐地询问了它。
我得到的答案是这样的:
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,以及每个单独使用和不使用 | 都没有成功。
鉴于错误 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 做得正确
我不应该做什么?
对于可能引起注意的任何拼写/语法错误,我们深表歉意,感谢您抽出宝贵时间。
【问题讨论】:
-
不是你的错,请注意。 MSDN 通常非常擅长指定最低版本要求,但微软在这方面确实放弃了。
-
感谢@eryksun 和 Harry Johnston (不能在一条评论中提及 2 次)。您介意将其作为答案,以便我将其标记为已解决吗?
标签: c++ windows winapi terminal console