我正在做一个简单的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;变量得到了正确的数据。事实证明,即使用它检索光标位置也是不可能的。
请告诉我哪里错了。提前谢谢。
答案 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";
}