目录
GetStdHandle 是一个 Windows API 函数,用于获取标准输入、标准输出或标准错误设备的句柄。它定义在 Windows 的核心头文件 <windows.h> 中,通常用于控制台应用程序中,以便与标准输入输出流(如键盘输入或控制台输出)进行交互。
什么是 GetStdHandle?
GetStdHandle
函数的全称是 "Get Standard Handle"。
Get":表示这是一个获取操作。
"Std":是 Standard(标准)的缩写,指的是标准输入、输出或错误流。
"Handle":指的是一个句柄(handle),在 Windows 中,句柄通常是对系统资源(如文件、窗口、输入输出流等)的一种引用或标识。
想象你在用 C++ 写程序时,经常用 std::cout 来输出文字到屏幕上,对吧?比如:
#include <iostream>
int main() {
std::cout << "Hello, world!" << std::endl;
return 0;
}
这里 std::cout 是一个“工具”,它负责把文字送到屏幕上。但在 Windows 系统中,如果你不用 C++ 的标准库,而是直接跟操作系统“对话”,就需要用到 Windows 提供的一些函数,其中 GetStdHandle 就是帮你拿到类似 std::cout 这样的“工具”的。
简单来说,GetStdHandle 是 Windows 给你的一个函数,它能让你拿到控制台的“钥匙”(专业术语叫“句柄”),有了这个钥匙,你就可以直接跟屏幕(或键盘)互动了。
它长什么样?
在 C++ 代码里,GetStdHandle 的样子是这样的:
HANDLE GetStdHandle(DWORD nStdHandle);
HANDLE: 这是“钥匙”的类型,类似于一个指针,但具体是什么暂时不用管,只要知道它代表某个东西就行。
DWORD: 这是 Windows 定义的一个数字类型,相当于 unsigned int,用来告诉函数你想要哪把“钥匙”。
nStdHandle: 你传给函数的参数,告诉它“我想要屏幕的钥匙”还是“键盘的钥匙”。
常见的选项有:
STD_OUTPUT_HANDLE(写成 -11):给我屏幕的钥匙,我想输出东西。(就是用来让程序往屏幕上打印内容)
STD_INPUT_HANDLE(写成 -10):给我键盘的钥匙,我想读输入。(就是用来让程序从键盘读取用户的输入)
STD_ERROR_HANDLE(写成 -12):给我错误输出的钥匙(也是屏幕,但可以单独用)。
怎么用它?
假设你想用 GetStdHandle 在屏幕上写“Hello, Windows!”,我们可以这样写:
#include <windows.h> // 必须包含这个头文件,里面有 Windows 的工具
#include <cstring>
int main() {
// 1. 拿到屏幕的“钥匙”
HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
// 2. 检查钥匙是不是拿到了
if (screen == INVALID_HANDLE_VALUE) { // 如果钥匙是“坏的”
return 1; // 出错了,退出程序
}
// 3. 用这个钥匙写东西到屏幕上
const char* message = "Hello, Windows!\n";
DWORD written; // 用来记录写了多少个字符
WriteConsoleA(screen, message, strlen(message), &written, NULL);
return 0;
}
一步步解释:
拿到钥匙:
GetStdHandle(STD_OUTPUT_HANDLE) 就像去问 Windows:“给我屏幕的钥匙吧!” 返回的 screen 是一个 HANDLE,你可以把它想象成一个工具的“ID”。
检查钥匙:
如果程序没有屏幕(比如你关了控制台窗口),Windows 会给你一个“坏钥匙”(INVALID_HANDLE_VALUE),所以要检查一下。
用钥匙做事:
WriteConsoleA 是另一个 Windows 函数,专门用这个“钥匙”在屏幕上写东西。
它需要:
screen: 你刚拿到的钥匙。
message: 你想写什么。
strlen(message): 写多少个字符。
&written: 记录实际写了多少(类似 C++ 的传引用)。
NULL: 最后一个参数先不用管,写 NULL 就好。
运行这个程序,你会在黑色的控制台窗口看到“Hello, Windows!”。
它跟 std::cout 有什么不一样?
std::cout 是 C++ 标准库提供的,简单好用,但它藏了很多细节,你不知道它是怎么跟屏幕沟通的。
GetStdHandle + WriteConsoleA 是直接跟 Windows 操作系统打交道,给你更多控制权。比如,你可以用它改变文字颜色,或者直接读键盘按键,而 std::cout 做不到这些。