Win32 API
Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤
的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启
视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便
称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows
32位平台的应⽤程序编程接⼝。
简单来说就是通过调用API中的各种函数,从而使应用程序在windows系统上运行
控制台程序
平常我们运⾏起来的⿊框程序其实就是控制台程序
我们可以使⽤cmd命令来设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列
1 mode con cols= 100 lines= 30
也可以通过命令设置控制台窗⼝的名字:
1 title 贪吃蛇
system
这些能在控制台窗⼝执⾏的命令,也可以调⽤C语⾔函数system来执⾏。
注意:system只检查命令处理器是否可通过此函数使用,其他一概不管。
system("paus"); //暂停system("cls");//清理屏幕!!!
mode指令
例如:
通过使用mode指令,设置命令窗口大小
mode con cols=100 lines=30
设置窗口名称
tile "贪吃蛇"
控制台屏幕上的坐标COORD
COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕上的坐标
COORD原型:
typedef struct _ COORD {SHORT X;SHORT Y;} COORD, *PCOORD;
给坐标赋值:
COORD pos = { 10 , 15 };
GetStdHandle
GetStdHandle是⼀个Windows API 函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。
函数原型:
HANDLE WINAPI GetStdHandle(
_In_ DWORD nStdHandle
);
CONSOLE_CURSOR_INFO
CONSOLE_CURSOR_INFO是一个结构体
结构体内容:
typedef struct _ CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
• dwSize,由光标填充的字符单元格的百分比。 此值介于1到100之间。 光标外观会变化,范围从完 全填充单元格到单元底部的水平线条。
• bVisible,游标的可见性。 如果光标可见,则此成员为 TRUE。
使用这个函数可以设置光标填充字符单元占比和设置光标是否可见。
SetConsoleCursorInfo
设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性。
BOOL WINAPI SetConsoleCursorInfo (HANDLE hConsoleOutput,const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo);
简单来说,SetConsoleCursorInfo就是将CONSOLE_CURSOR_INFO中的结构体成员即光标占比和国标是否隐藏修改过的内容使其实现的这么一个函数。
实例:
HANDLE hOutput = GetStdHandle (STD_OUTPUT_HANDLE);// 影藏光标操作CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo (hOutput, &CursorInfo); // 获取控制台光标信息CursorInfo.dwSize = 100; //控制台光标占比CursorInfo.bVisible = false ; // 隐藏控制台光标SetConsoleCursorInfo (hOutput, &CursorInfo); // 设置控制台光标状态
可根据监视窗口来查看
默认值
修改后
SetConsoleCursorPosition
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用 SetConsoleCursorPosition函数将光标位置设置到指定的位置。
函数原型:
BOOL WINAPI SetConsoleCursorPosition (HANDLE hConsoleOutput,COORD pos);
实例
int main()
{
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { 10, 5 };
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput, pos);
getchar();
return 0;
}
SetPos:封装⼀个设置光标位置的函数
这里就可以封装一个位置函数,将光标定位到我们想要的位置
//设置光标的坐标
void SetPos(short x, short y)
{COORD pos = { x, y };HANDLE hOutput = NULL;//获取标准输出的句柄(⽤来标识不同设备的数值)hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//设置标准输出上光标的位置为posSetConsoleCursorPosition(hOutput, pos);
}
GetAsyncKeyState
获取按键情况,GetAsyncKeyState的函数原型如下:
SHORT GetAsyncKeyState (int vKey);
将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。
GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果
返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1.
为了使用方便,用宏定义重命名一下
# define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
虚拟按码可直接搜索,这里就简单的列举一下。
虚拟按码:
制作一个简单按键测试器
实例:
#define KEY_PRESS(vk) ((GetAsyncKeyState(vk) & 0x1) ? 1 : 0)int main()
{while (1){if (KEY_PRESS(0x30))printf("0\n");else if (KEY_PRESS(0x31))printf("1\n");else if (KEY_PRESS(0x32))printf("2\n");else if (KEY_PRESS(0x33))printf("3\n");else if (KEY_PRESS(0x34))printf("4\n");else if (KEY_PRESS(0x35))printf("5\n");else if (KEY_PRESS(0x36))printf("6\n");else if (KEY_PRESS(0x37))printf("7\n");else if (KEY_PRESS(0x38))printf("8\n");else if (KEY_PRESS(0x39))printf("9\n");}return 0;
}