如何让propper使用console_screen_buffer_info_ex?

时间:2016-04-22 11:29:50

标签: c++ winapi

我正在做一个简单的winapi编码,突然遇到了一个奇怪的问题。 这段代码:

HANDLE hConsOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFOEX infoex;
GetConsoleScreenBufferInfoEx(hConsOut, &infoex);
cout << "x: " << infoex.dwCursorPosition.X;

给出了&#34; x:-13108&#34;的输出。 虽然这个:

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO info;
GetConsoleScreenBufferInfo(hConsole, &info);
cout << "x: " << info.dwCursorPosition.X;

给了我&#34; x:0&#34;,这是正确的,预期的答案。

我可能错了,但不是以前的扩展版本吗? 为什么,当有这样类似的用途时,扩展版本的缓冲区让我(显然)错误的数据?

这两个示例都来自msdn并且不会产生编译时错误。

首先,我有兴趣用

改变控制台的颜色
infoex.ColorTable[0] = RGB(255,0,0);
SetConsoleScreenBufferInfoEx(hConsOut, &infoex);

但是当它失败时,我决定测试是否&#34; infoex&#34;变量得到了正确的数据。事实证明,即使用它检索光标位置也是不可能的。

请告诉我哪里错了。提前谢谢。

1 个答案:

答案 0 :(得分:0)

如上所述,对 GetConsoleScreenBufferInfoEx 的任何调用都需要有效的 cbSize 值。

这是一个有效的代码片段:

auto readHandle = GetStdHandle(STD_OUTPUT_HANDLE);
if (readHandle == INVALID_HANDLE_VALUE) {
    std::cerr << "! invalid handle\n";
}

CONSOLE_SCREEN_BUFFER_INFOEX info{0};
info.cbSize = sizeof(info);
if (GetConsoleScreenBufferInfoEx(readHandle, &info) == 0) {
    std::cerr << "! GetConsoleScreenBufferInfoEx failed\n";
}