windowsAPI函数

本文最后更新于:2019年10月12日 下午

学了很久C语言,每次运行程序看到的都是小黑框,是否感到无聊呢?

当你学会下面的函数后,你就可以让小黑框随意的改变颜色。

必要的一些说明

肯定需要windows.h头文件

HANDLE 是windows句柄,一个windows部件对应的id

COORD是一个坐标的结构体,里面有x和y

gotoxy

1
2
3
4
5
6
void gotoxy(int x, int y)
{
COORD pos = {x, y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}

隐藏控制台光标

1
2
3
4
5
6
7
8
void hideCursor()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
}

显示控制台光标

1
2
3
4
5
6
7
8
void showCursor()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = true; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
}

设置窗口标题

1
2
3
4
void setTitle(char *title)
{
SetConsoleTitle(title);
}

获取窗口标题

1
2
3
4
5
6
char* getTitle()
{
char strTitle[255];
GetConsoleTitle(strTitle, 255); // 获取窗口标题
return strTitle;
}

获取控制台窗口大小

1
2
3
4
5
6
7
COORD getScreenSize()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo(hOut, &bInfo);
return bInfo.dwSize;
}

设置控制台窗口大小

1
2
3
4
5
6
7
8
9
void setScreenSize(int x, int y)
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD size = {x, y};
SetConsoleScreenBufferSize(hOut, size); // 重新设置缓冲区大小
SMALL_RECT rc = {0, 0, x - 1, y - 1}; // 重置窗口位置和大小
SetConsoleWindowInfo(hOut, true, &rc);
SetConsoleScreenBufferSize(hOut, size); // 重新设置缓冲区大小
}

禁止改变窗口大小

1
2
3
4
5
6
7
8
9
10
11
12
void forbidChengeScreenSize()
{
char strTitle[255];
GetConsoleTitle(strTitle, 255);
HWND hWnd = FindWindow(NULL, strTitle); //获得cmd窗口句柄
RECT rc;
GetWindowRect(hWnd, &rc); //获得cmd窗口对应矩形
//改变cmd窗口风格
SetWindowLongPtr(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
//因为风格涉及到边框改变,必须调用SetWindowPos,否则无效果
SetWindowPos(hWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, NULL);
}

一些例子

带颜色的格式化输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <Windows.h>
#include <assert.h>

void gotoxy(int x, int y)
{
COORD pos = {x, y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}

void colorPrintf(int color, char *str,...)
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut, color);
int i = 0;
int x = 0;
char *pstr = NULL;
va_list arg; //定义va_list类型变量arg
va_start(arg,str); //arg初始化,将arg指向第一个可选参数
assert(str); //保证str不为空
while (*str)
{
if(*str == '%')
{
str++;
switch(*str)
{
case 's':
pstr = va_arg(arg,char*); //va_arg的第二个参数是你要返回的参数的类型,此处是char*
printf("%s", pstr);
break;
case 'c':
x = va_arg(arg,int); //返回参数列表中的当前参数,并使arg指向参数列表中的下一个参数
putchar(x);
break;
case 'd':
x = va_arg(arg, int);
printf("%d", x);
break;
default:
putchar(*(str-1));
putchar(*str);
break;
}
str++;
}
else
{
putchar(*str);
str++;
}
}
va_end(arg);
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
}
int main()
{
for(int i = 1; i < 16; i++)
{
gotoxy(i * 2, i);
colorPrintf(i, "□这是第%d句带颜色的字符串■\n", i);
}
return 0;
}

在输出字符的时候控制台会