控制台双缓冲技术
前言
在控制台重绘中,由于界面的不断刷新,显示部分会有一定的闪烁,解决这个问题的办法就是双缓冲技术,由两个缓冲区相互输出,从而达到屏幕无闪烁的效果
相关函数
CreateConsoleScreenBuffer
创建一个屏幕缓冲区
声明
HANDLE WINAPI CreateConsoleScreenBuffer(
_In_ DWORD dwDesiredAccess, //权限
_In_ DWORD dwShareMode, //共享模式
_In_opt_ const SECURITY_ATTRIBUTES *lpSecurityAttributes, //安全级别
_In_ DWORD dwFlags, //标识符
_Reserved_ LPVOID lpScreenBufferData //保留,为NULL
);//创建屏幕缓冲区
参数
dwDesiredAccess
缓冲区权限,有以下可选值
名称 | 值 | 含义 |
---|---|---|
GENERIC_READ | 0x80000000 | 指示缓冲区可读 |
GENERIC_WRITE | 0x40000000 | 指示缓冲区可写 |
dwShareMode
分享权限
名称 | 值 | 含义 |
---|---|---|
FILE_SHARE_READ | 0x00000001 | 缓冲区可共享读 |
FILE_SHARE_WRITE | 0x00000002 | 缓冲区可共享写 |
lpSecurityAttributes
指向安全属性的指针,如不是NULL,将指示一个SECURITY_ATTRIBUTES结构体,若是NULL,则该句柄无法被子进程继承
dwFlags
标识符,指创建缓冲区的类型,目前只支持一种
名称 | 值 | 含义 |
---|---|---|
CONSOLE_TEXTMODE_BUFFER | 0x00000001 | 文本模式输出 |
lpScreenBufferData
该值保留,应为NULL
返回值
若函数成功,则返回指向缓冲区的一个句柄
若函数失败,则返回INVALID_HANDLE_VALUE(-1),若获取更多的信息请使用GetLastError
成功返回的缓冲区以下属性与现有缓冲区相同
- 字体 - 从当前活跃的缓冲区复制
-
- 显示的窗口大小 - 从当前活跃的缓冲区复制
-
- 缓冲区大小 - 与显示的窗口匹配 (不复制)
-
- 默认属性 (颜色) - 从当前活跃的缓冲区复制
-
- 默认弹出属性 (颜色) - 从当前活跃的缓冲区复制
-
要求
名称 | 值 |
---|---|
最小支持客户端版本 | Windows 2000专业版[仅桌面应用程序] |
最小支持服务器版本 | Windows 2000服务器[仅桌面应用程序] |
头文件 | ConsoleApi2.h(通过Wincon.h,包含Windows.h) |
库文件 | Kernel32.lib |
DLL | Kernel32.dll |
SetConsoleActiveScreenBuffer
设置控制台活动缓冲区
声明
BOOL WINAPI SetConsoleActiveScreenBuffer(
_In_ HANDLE hConsoleOutput //缓冲区输出句柄
);//设置控制台活动缓冲区
参数
hConsoleOutput
要设置的缓冲区输出句柄
返回值若函数成功,则返回非零(TRUE)
若函数不成功,则返回FALSE,若获取更多的信息请使用GetLastError
要求
名称 | 值 |
---|---|
最小支持客户端版本 | Windows 2000专业版[仅桌面应用程序] |
最小支持服务器版本 | Windows 2000服务器[仅桌面应用程序] |
头文件 | ConsoleApi2.h(通过Wincon.h,包含Windows.h) |
库文件 | Kernel32.lib |
DLL | Kernel32.dll |
CloseHandle
关闭指定打开的句柄
声明
BOOL CloseHandle(
HANDLE hObject //指定的句柄
);//关闭打开的句柄
参数
hObject
指向打开对象的句柄
返回值
若函数成功,则返回非零
若函数失败,则返回0,若获取更多的信息请使用GetLastError
若程序在调试模式下进行,则失败时抛出异常
失败有以下几种情况
- 句柄无效- 将同一句柄使用CloseHandle两次
- 将应使用FindClose关闭的句柄使用CloseHandle关闭
标记
使用CloseHandle可关闭以下类型的句柄
- 权限令牌
- 交互设备
- 控制台输入
- 控制台屏幕缓冲区
- 事件 (Event)
- 文件
- 文件映射
- 输入与输出端口
- 任务(Job)
- 邮槽(Mailslot)
- 内存资源标识
- 互斥量(Mutex)
- 被命名的管道
- 管道
- 进程
- 信号(Semaphore)
- 线程- Transaction
- 可等待的计时器
要求
名称 | 值 |
---|---|
最小支持客户端版本 | Windows 2000专业版[桌面应用程序 或 UWP程序] |
最小支持服务器版本 | Windows 2000服务器[桌面应用程序 或 UWP程序] |
头文件 | handleapi.h(包括Windows.h) |
库文件 | Kernel32.lib |
DLL | Kernel32.dll |
应用
以下代码会有闪烁出现
#include <stdio.h>
#in