在了解句柄的概念和宏定义的前提下,就可以利用windows.h 头文件用已经定义好的许多函数的结构体做出很多功能了
比如读取鼠标状态信息(坐标,鼠标按键等)
(如果编译完此程序鼠标移动,点击黑框框均无反应,那么在编译运行出现黑框框后,右键黑框框顶栏->属性->选项->在"编辑选项"中的第一个选项“快速编辑模式”的勾选去掉即可!)
精简版:(详尽注释在下面的版本)
#include <stdio.h>
#include <windows.h>
void gotoxy(int x,int y) //光标移动函数,X表示横坐标,Y表示纵坐标。
{
COORD coord; //使用头文件自带的坐标结构
coord.X=x; //这里将int类型值传给short int
coord.Y=y;
HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出句柄
SetConsoleCursorPosition(a,coord); //以标准输出的句柄为参数设置控制台光标坐标
}
int main(void)
{
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); //获得标准输入设备句柄
INPUT_RECORD mouse; //定义输入事件结构体
DWORD res; //res用于存储读取记录
COORD crPos; //crPos用于存储鼠标当前位置
while (1)
{
ReadConsoleInput(hIn, &mouse, 1, &res); //读取输入事件
if (mouse.EventType == MOUSE_EVENT) //相当于读取到的信息为鼠标事件
{
crPos = mouse.Event.MouseEvent.dwMousePosition; //获得当前鼠标位置
gotoxy(0,0); //去0,0位置打印出下面的文字
printf("当前鼠标位置坐标 X: %3lu Y: %3lu", crPos.X, crPos.Y);
if(mouse.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //如果鼠标左键被按下 FROM_LEFT_1ST_BUTTON_PRESSED表示最左边的鼠标键被按下
{
gotoxy(crPos.X,crPos.Y); //那么光标移动到这个坐标打印
printf("&"); //打印出"&" ,这里可以随便换其他字符
}
}
}
CloseHandle(hIn); // 关闭标准输入设备句柄
return 0;
}
详尽注释版:
#include <stdio.h>
#include <windows.h>
void gotoxy(int x,int y) //光标移动函数,X表示横坐标,Y表示纵坐标。
{
COORD coord; //使用头文件自带的坐标结构
coord.X=x; //这里将int类型值传给short
coord.Y=y;
HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出句柄
SetConsoleCursorPosition(a,coord); //以标准输出的句柄为参数设置控制台光标坐标
}
int main(void)
{
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); //获得标准输入设备句柄
INPUT_RECORD mouse; //定义输入事件结构体
/* 结构体INPUT_RECORD的说明:
INPUT_RECORD结构体中的EnventType成员用于说明事件的类型,
typedef struct _INPUT_RECORD
{
WORD EventType; // 事件类型
union
{
KEY_EVENT_RECORD KeyEvent; //键盘事件
MOUSE_EVENT_RECORD MouseEvent; //鼠标事件
WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent; //窗口缓冲事件
MENU_EVENT_RECORD MenuEvent; //菜单事件
FOCUS_EVENT_RECORD FocusEvent; //摄像头事件
} Event;
} INPUT_RECORD; */
DWORD res; //res用于存储读取记录
COORD crPos; //crPos用于存储鼠标当前位置
while (1)
{
ReadConsoleInput(hIn, &mouse, 1, &res); //读取输入事件
/* ReadConsoleInput函数说明:
BOOL ReadConsoleInput(
HANDLE hConsoleInput, //输入句柄
PINPUT_RECORD lpBuffer, //指向INPUT_RECORD结构体(数组)的指针
DWORD nLength, //上面那个结构体的大小 typedef unsigned long DWORD; 说白了DWORD就是个无符号整形
LPDWORD lpNumberOfEventsRead //实际读入输入内容的个数,LPDWORD为长指针,PDWORD 为短指针都属于指针。
);
它能获得对于这个Console的键盘和鼠标输入,相当于执行函数了就会读取(鼠标)信息放入mouse和res里 */
if (mouse.EventType == MOUSE_EVENT) //相当于读取到的信息为鼠标事件
{
/* 这里再重复一遍INPUT_RECORD函数体....
INPUT_RECORD结构体中的EnventType成员用于说明事件的类型,
typedef struct _INPUT_RECORD
{
WORD EventType; // 事件类型,typedef unsigned short int WORD; 说白了WORD就是个无符号短整型
union
{
KEY_EVENT_RECORD KeyEvent; //键盘事件
MOUSE_EVENT_RECORD MouseEvent; //鼠标事件
WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent; //窗口缓冲事件
MENU_EVENT_RECORD MenuEvent; //菜单事件
FOCUS_EVENT_RECORD FocusEvent; //摄像头事件
} Event;
} INPUT_RECORD; */
/* MOUSE_EVENT_RECORD结构体说明:
typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体
{
COORD dwMousePosition; //当前鼠标在控制台窗口缓冲区的位置
DWORD dwButtonState; //鼠标按键的状态 注:typedef unsigned long DWORD
DWORD dwControlKeyState; //控制键状态
DWORD dwEventFlags; //鼠标事件类型
} MOUSE_EVENT_RECORD; */
crPos = mouse.Event.MouseEvent.dwMousePosition; //获得当前鼠标位置
gotoxy(0,0); //去0,0位置打印出下面的文字
printf("当前鼠标位置坐标 X: %3lu Y: %3lu", crPos.X, crPos.Y);
if(mouse.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //如果鼠标左键被按下 FROM_LEFT_1ST_BUTTON_PRESSED表示最左边的鼠标键被按下
{
gotoxy(crPos.X,crPos.Y); //那么光标移动到这个坐标打印
printf("&"); //打印出"&" ,这里可以随便换其他字符
}
}
}
CloseHandle(hIn); // 关闭标准输入设备句柄
return 0;
}