如何在Windows中获取GetConsoleMode()的“输出”(控制台屏幕缓冲区)句柄?

okxuctiv  于 2023-02-10  发布在  Windows
关注(0)|答案(1)|浏览(252)

我想在输入和输出上执行GetConsoleMode(),因为我想更改一些标志。
输入为pretty straightforward

HANDLE hStdin;
DWORD fdwSaveOldMode;

hStdin = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(hStdin, &fdwSaveOldMode)

另一方面,输出看起来并不容易,有人会认为只放置STD_OUTPUT_HANDLE就足够了,但是"help" pages谈到必须制作和设置自己的缓冲区。
这一点,以及page about handles提及:
在CreateFile调用中指定CONOUT $值以打开控制台活动屏幕缓冲区的句柄。
听起来像是一个线索,但是坦白说,我不确定这到底是什么意思。有人能告诉我如何正确地做吗?为什么输出和输入如此不同?
谢谢大家!

qpgpyjmq

qpgpyjmq1#

有人可能会认为,只输入STD_OUTPUT_HANDLE就足够了
"Clearing the Screen" example有一个代码片段演示如何设置控制台输出模式,它使用GetStdHandle()

HANDLE hStdOut;

hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

// Fetch existing console mode so we correctly add a flag and not turn off others
DWORD mode = 0;
if (!GetConsoleMode(hStdOut, &mode))
{
    return ::GetLastError();
}

// Hold original mode to restore on exit to be cooperative with other command-line apps.
const DWORD originalMode = mode;
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;

// Try to set the mode.
if (!SetConsoleMode(hStdOut, mode))
{
    return ::GetLastError();
}

GetStdHandle不能与控制台特定函数一起工作的一些情况是,应用程序不是控制台模式(您可以通过调用AllocConsole在GUI模式应用程序中获得控制台),或者stdout被重定向。
在这种情况下,你需要通过CreateFile和特殊的文件名"CONOUT$"打开一个控制台句柄,这样就可以访问一个控制台,如果一个控制台与你的进程相关联,即使stdout没有Map到那个控制台。

相关问题