WIN32 API函数

目录

一、定义

二、一些窗口管理函数 

COORD

1.定义

以下是 COORD 结构体的定义:

2.使用场景

3.示例

HANDLE

1.定义

GetStdHandle

1.定义

原型如下

2.示例

GetConsoleCursorInfo

1.定义

函数原型如下

参数说明

函数返回值

CONSOLE_CURSOR_INFO 结构体

定义如下

2.示例

SetConsoleCursorInfo

1.定义

原型 

参数说明

函数返回值

2.示例

SetConsoleCursorPosition

1.定义

原型

参数说明

函数返回值

2.示例

GetAsyncKeyState

1.定义

原型

参数说明

函数返回值

2.示例

3.键值表

感谢观看,您的支持是我最大的动力!


一、定义

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
);
参数说明
  1. hConsoleOutput:一个控制台输出句柄,通常通过 GetStdHandle(STD_OUTPUT_HANDLE) 获取。
  2. 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
);
参数说明
  1. hConsoleOutput:一个指向控制台输出句柄的指针,通常通过 GetStdHandle(STD_OUTPUT_HANDLE) 获得。
  2. 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 结构体中的 dwSizebVisible 字段,并通过调用 SetConsoleCursorInfo 将这些更改应用到控制台光标上。

注意,控制台光标的默认大小通常是 100%,并且默认是可见的。在实际应用中,可以根据需要调整光标的大小和可见性,以提供更好的用户体验。

SetConsoleCursorPosition

1.定义

SetConsoleCursorPosition 是 Windows API 中的一个函数,它用于设置控制台窗口中光标的位置。通过这个函数,你可以精确地控制光标在控制台中的位置,从而在特定位置显示文本或响应用户输入。

原型
BOOL SetConsoleCursorPosition(
  HANDLE hConsoleOutput,
  COORD dwCursorPosition
);
参数说明
  1. hConsoleOutput:一个控制台输出句柄,通常通过 GetStdHandle(STD_OUTPUT_HANDLE) 获取。
  2. 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_KEYDOWNWM_KEYUP)可能更为合适。

3.键值表

这里有人整理好了,大家可以去查询:

虚拟键值表_window虚拟键值-CSDN博客

感谢观看,您的支持是我最大的动力!

>>喜欢请三连加关注,冬码农持续创作优质作品中<<

希望与您一同成长!

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬有雪的学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值