目录
一、定义
WIN32 API 是一组用于 Windows 操作系统的应用程序接口(API),它允许开发者编写可以访问系统资源的应用程序。这些资源包括文件、内存、网络连接等。WIN32 API 提供了丰富的函数,用于实现各种功能,比如窗口管理、图形绘制、网络通信等。
二、一些窗口管理函数
COORD
1.定义
COORD
是一个在 Windows 编程中常用的结构体,它是 Win32 API 的一部分,用于表示字符屏幕上的一个点或坐标位置。COORD
结构体通常用于与控制台应用程序中的字符缓冲区进行交互,比如获取光标位置或设置光标位置。
以下是 COORD
结构体的定义:
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
X
字段表示点的列(水平方向)坐标。Y
字段表示点的行(垂直方向)坐标。
在控制台应用程序中,(0, 0)
坐标通常代表左上角的第一个字符位置。
2.使用场景
获取光标位置:使用
GetConsoleCursorPosition
函数,获取当前控制台光标的位置,返回值是一个COORD
结构体
设置光标位置:使用
SetConsoleCursorPosition
函数,传入一个COORD
结构体来指定新的光标位置
3.示例
下面是一个简单的示例,展示如何在控制台中设置光标位置:
(建议先往下看再回头看这个示例)
#include <windows.h>
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X = 10;
coord.Y = 5;
SetConsoleCursorPosition(hConsole, coord);
return 0;
}
HANDLE
1.定义
在 Windows 编程中,
HANDLE
是一个非常重要的概念,它是一个通用的指针类型,用于引用系统中的各种对象。这些对象可以是文件、进程、线程、窗口、设备上下文、套接字、事件、互斥体、信号量等。
GetStdHandle
1.定义
GetStdHandle
是 Windows API 中的一个函数,它用于获取标准设备句柄。在 Windows 系统中,标准设备句柄指的是与控制台应用程序相关联的标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的句柄。
原型如下
HANDLE GetStdHandle(
DWORD nStdHandle
);
参数 nStdHandle
可以是以下值之一:
STD_INPUT_HANDLE
:标准输入的句柄。STD_OUTPUT_HANDLE
:标准输出的句柄。STD_ERROR_HANDLE
:标准错误的句柄。
GetStdHandle
函数返回一个 HANDLE
类型的值,该值是一个句柄,可以用于后续的输入输出操作。如果请求的句柄不存在或无法获取,函数将返回 INVALID_HANDLE_VALUE
,这是一个特殊的句柄值,表示获取句柄失败。
2.示例
下面是一个简单的示例,展示如何使用 GetStdHandle
来获取标准输出句柄,并使用它来写入一些文本到控制台:
#include <windows.h>
#include <iostream>
int main() {
// 获取标准输出句柄
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdOut == INVALID_HANDLE_VALUE) {
std::cerr << "无法获取标准输出句柄。" << std::endl;
return 1;
}
// 定义要写入的字符和长度
const char* text = "Hello, World!";
DWORD bytesWritten;
// 写入文本到控制台
if (!WriteFile(hStdOut, text, strlen(text), &bytesWritten, NULL)) {
std::cerr << "写入失败。" << std::endl;
return 1;
}
return 0;
}
GetConsoleCursorInfo
1.定义
GetConsoleCursorInfo
是一个 Windows API 函数,用于检索控制台窗口的光标信息。这个函数可以获取当前光标的位置、大小和可见性等属性。
函数原型如下
BOOL GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
参数说明
hConsoleOutput
:一个控制台输出句柄,通常通过GetStdHandle(STD_OUTPUT_HANDLE)
获取。lpConsoleCursorInfo
:一个指向CONSOLE_CURSOR_INFO
结构体的指针,该结构体用于接收光标的当前信息。
函数返回值
- 如果函数成功,返回值是
TRUE
。 - 如果函数失败,返回值是
FALSE
。可以通过调用GetLastError
函数来获取错误代码。
CONSOLE_CURSOR_INFO
结构体
定义如下
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize; // 光标的大小,为 1 到 100 的百分比
BOOL bVisible; // 光标是否可见
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
dwSize
:表示光标的大小,是光标在字符单元中所占的百分比,取值范围通常是 1% 到 100%。bVisible
:一个布尔值,指示光标是否可见。
2.示例
#include <windows.h>
#include <iostream>
int main() {
HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
if (!GetConsoleCursorInfo(hConsoleOutput, &cci)) {
std::cerr << "获取光标信息失败,错误代码:" << GetLastError() << std::endl;
return 1;
}
std::cout << "光标大小: " << cci.dwSize << "%" << std::endl;
std::cout << "光标可见性: " << (cci.bVisible ? "可见" : "不可见") << std::endl;
return 0;
}
在这个示例中,我们首先获取标准输出句柄,然后定义一个 CONSOLE_CURSOR_INFO
结构体来存储光标信息。调用 GetConsoleCursorInfo
函数后,我们检查返回值以确定是否成功获取了光标信息。如果成功,我们打印出光标的大小和可见性状态。
SetConsoleCursorInfo
1.定义
SetConsoleCursorInfo
是 Windows API 中的一个函数,它用于设置控制台光标的大小和可见性。这个函数允许控制台应用程序改变光标的外观,以适应不同的显示需求。
原型
BOOL SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);
参数说明
hConsoleOutput
:一个指向控制台输出句柄的指针,通常通过GetStdHandle(STD_OUTPUT_HANDLE)
获得。lpConsoleCursorInfo
:一个指向CONSOLE_CURSOR_INFO
结构体的指针,该结构体包含了要设置的光标信息。
函数返回值
- 如果函数成功,返回值是
TRUE
。 - 如果函数失败,返回值是
FALSE
。可以通过调用GetLastError
函数来获取错误代码。
2.示例
#include <windows.h>
#include <iostream>
int main() {
HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
// 获取当前的光标信息
if (!GetConsoleCursorInfo(hConsoleOutput, &cci)) {
std::cerr << "获取光标信息失败,错误代码:" << GetLastError() << std::endl;
return 1;
}
// 修改光标大小和可见性
cci.dwSize = 25; // 设置光标大小为 25%
cci.bVisible = FALSE; // 隐藏光标
// 应用新的光标设置
if (!SetConsoleCursorInfo(hConsoleOutput, &cci)) {
std::cerr << "设置光标信息失败,错误代码:" << GetLastError() << std::endl;
return 1;
}
std::cout << "光标已设置为大小 25%,并且已隐藏。" << std::endl;
// 等待用户按键,以观察光标变化
std::cout << "按任意键继续..." << std::endl;
std::cin.get();
// 恢复光标为默认设置
cci.dwSize = 100; // 光标大小恢复为 100%
cci.bVisible = TRUE; // 光标可见
if (!SetConsoleCursorInfo(hConsoleOutput, &cci)) {
std::cerr << "恢复光标信息失败,错误代码:" << GetLastError() << std::endl;
return 1;
}
return 0;
}
在这个示例中,我们首先获取了控制台的输出句柄,然后通过调用 GetConsoleCursorInfo
获取了当前的光标信息。接着,我们修改了 CONSOLE_CURSOR_INFO
结构体中的 dwSize
和 bVisible
字段,并通过调用 SetConsoleCursorInfo
将这些更改应用到控制台光标上。
注意,控制台光标的默认大小通常是 100%,并且默认是可见的。在实际应用中,可以根据需要调整光标的大小和可见性,以提供更好的用户体验。
SetConsoleCursorPosition
1.定义
SetConsoleCursorPosition
是 Windows API 中的一个函数,它用于设置控制台窗口中光标的位置。通过这个函数,你可以精确地控制光标在控制台中的位置,从而在特定位置显示文本或响应用户输入。
原型
BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD dwCursorPosition
);
参数说明
hConsoleOutput
:一个控制台输出句柄,通常通过GetStdHandle(STD_OUTPUT_HANDLE)
获取。dwCursorPosition
:一个COORD
结构体,指定了光标要被设置到的新位置。
函数返回值
- 如果函数成功,返回值是
TRUE
。 - 如果函数失败,返回值是
FALSE
。可以通过调用GetLastError
函数来获取错误代码。
2.示例
#include <windows.h>
#include <iostream>
int main() {
HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
// 设置光标位置到第 10 行第 15 列
coord.X = 15;
coord.Y = 9;
if (!SetConsoleCursorPosition(hConsoleOutput, coord)) {
std::cerr << "设置光标位置失败,错误代码:" << GetLastError() << std::endl;
return 1;
}
// 光标已设置,现在可以在这个位置输出文本
std::cout << "Hello, World!" << std::endl;
return 0;
}
在这个示例中,我们首先获取了控制台输出的句柄,然后定义了一个 COORD
结构体来表示我们想要设置的光标位置。调用 SetConsoleCursorPosition
函数后,我们检查返回值以确定是否成功设置了光标位置。如果设置成功,我们就可以在新的位置输出文本 "Hello, World!"。
注意,控制台中的坐标系统以 (0, 0)
开始,其中 X
坐标表示列(水平方向),Y
坐标表示行(垂直方向)。通过使用 SetConsoleCursorPosition
,你可以在控制台程序中实现更复杂的文本定位和输出管理。
GetAsyncKeyState
1.定义
GetAsyncKeyState
是 Windows API 中的一个函数,用于检测键盘上某个键是否被按下,或者是否在消息被检索之前一直被按住。这个函数非常适合用于检测快捷键的按下状态,因为它可以检测到在消息队列中没有消息时的按键状态。
原型
SHORT GetAsyncKeyState(
int vKey
);
参数说明
vKey
:一个虚拟键码,指定要检测的键。虚拟键码是一组定义了标准键盘上每个键的值。例如,VK_LEFT
表示左箭头键,VK_RIGHT
表示右箭头键,VK_F1
到VK_F12
分别表示功能键 F1 到 F12。
函数返回值
- 如果
vKey
指定的键未被按下,返回值是 0。 - 如果
vKey
指定的键在消息队列中没有消息时被按下,返回值是 -32767。 - 如果
vKey
指定的键在消息队列中有一条或多条消息时被按下,返回值是 32767。
这里的关键点是,GetAsyncKeyState
可以检测到按键是否被按住,即使按键消息尚未被检索或处理。
2.示例
#include <windows.h>
#include <iostream>
int main() {
while (true) {
// 检测 F1 键是否被按下
if (GetAsyncKeyState(VK_F1) & 0x8000) {
std::cout << "F1 键被按下。" << std::endl;
}
// 检测左箭头键是否被按下
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
std::cout << "左箭头键被按下。" << std::endl;
}
// 添加一些延迟,以避免 CPU 占用过高
Sleep(50);
}
return 0;
}
在这个示例中,我们使用了一个无限循环来持续检测 F1 键和左箭头键是否被按下。如果检测到按键,我们打印一条消息到控制台。请注意,我们在循环中添加了 Sleep(50)
来减少循环的频率,这有助于减少程序对 CPU 的占用。
GetAsyncKeyState
通常用于游戏或需要快速响应按键的应用程序中。然而,对于大多数基于消息的应用程序,使用 GetKeyState
或消息循环中的键盘消息(如 WM_KEYDOWN
和 WM_KEYUP
)可能更为合适。
3.键值表
这里有人整理好了,大家可以去查询:
感谢观看,您的支持是我最大的动力!
>>喜欢请三连加关注,冬码农持续创作优质作品中<<
希望与您一同成长!