`GetStdHandle` 是 Windows API 中的一个函数,用于获取标准输入、输出或错误输出的句柄。以下是其用法详解:
cpp
HANDLE GetStdHandle(DWORD nStdHandle);
1. 读写控制台输入/输出
cpp
include
include
int main {
// 获取标准输出句柄
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INVALID_HANDLE_VALUE) {
std::cerr << "获取句柄失败!错误代码: " << GetLastError;
return 1;
// 使用句柄写入控制台
const char text = "Hello, 控制台!
;
DWORD charsWritten;
WriteConsole(hConsole, text, strlen(text), &charsWritten, NULL);
return 0;
2. 设置控制台文本属性(如颜色)
cpp
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
std::cout << "红色高亮文本";
3. 重定向标准输入/输出
cpp
// 将标准输出重定向到文件
HANDLE hFile = CreateFile("output.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
SetStdHandle(STD_OUTPUT_HANDLE, hFile);
HANDLE hNewStdOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取重定向后的句柄
1. 无需关闭句柄
`GetStdHandle` 返回的句柄由系统管理,不要调用 `CloseHandle` 关闭它们。
2. 错误处理
始终检查返回值是否为 `INVALID_HANDLE_VALUE`,尤其是当程序可能在没有控制台的环境(如 GUI 应用)中运行时。
3. 与 C/C++ 标准库的关系
C++ 的 `std::cout`、`std::cin` 和 C 的 `printf`、`scanf` 默认使用标准句柄。直接操作句柄会影响这些标准函数的行为。
4. Unicode 支持
若需处理 Unicode 字符,使用 `WriteConsoleW` 替代 `WriteConsole`,并传递宽字符字符串。
Q:程序没有控制台窗口时,`GetStdHandle` 会失败吗?
A:是的。对于 GUI 程序,需通过 `AllocConsole` 先创建控制台,或使用 `AttachConsole` 附加到父进程的控制台。
Q:如何恢复默认的标准输出?
A:在重定向前保存原始句柄,之后通过 `SetStdHandle` 恢复:
cpp
HANDLE hOrigStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
// ...重定向操作...
SetStdHandle(STD_OUTPUT_HANDLE, hOrigStdOut);
通过 `GetStdHandle`,你可以直接操作 Windows 控制台的底层句柄,实现更灵活的控制台交互。
版权声明: 知妳网保留所有权利,部分内容为网络收集,如有侵权,请联系QQ793061840删除,添加请注明来意。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态