上次讲的是键盘事件,这次我们介绍鼠标事件。下面先介绍下鼠标事件的结构体以及相关信息。
1 typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 2 { 3 COORD dwMousePosition; //当前鼠标在控制台窗口缓冲区的位置 4 DWORD dwButtonState; //鼠标按键的状态 5 DWORD dwControlKeyState; //控制键状态 6 DWORD dwEventFlags; //鼠标事件类型 7 } MOUSE_EVENT_RECORD; 8 /* 9 其中鼠标按键状态dwButtonState可能的值有 10 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11 FROM_LEFT_1ST_BUTTON_PRESSED 最左边的鼠标键被按下 一般来说就是鼠标左键 12 FROM_LEFT_2ND_BUTTON_PRESSED 左起第二个鼠标键被按下 一般来说是鼠标中键,就是滚轮键 13 FROM_LEFT_3RD_BUTTON_PRESSED 左起第三个鼠标键被按下 14 FROM_LEFT_4TH_BUTTON_PRESSED 左起第四个鼠标键被按下 15 RIGHTMOST_BUTTON_PRESSED 最右边的鼠标键被按下 一般来说是鼠标右键 16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 17 控制键状态dwControlKeyState与键盘事件的一样 18 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 ENHANCED_KEY 扩展键被按下 20 LEFT_ALT_PRESSED 左Alt键被按下 21 LEFT_CTRL_PRESSED 左Ctrl键被按下 22 RIGHT_ALT_PRESSED 右Alt键被按下 23 RIGHT_CTRL_PRESSED 右Ctrl键被按下 24 NUMLOCK_ON 数字锁定被打开 25 SCROLLLOCK_ON 滚动锁定被打开 26 CAPSLOCK_ON 大写锁定被打开 27 SHIFT_PRESSED Shift键被按下 28 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 29 鼠标事件类型dwEventFlags有以下几种 30 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31 DOUBLE_CLICK 双击,第一击只作为普通按键事件,第二击才作为双击事件 32 MOUSE_HWHEELED 水平鼠标滚轮移动 33 MOUSE_MOVED 鼠标移动 34 MOUSE_WHEELED 垂直鼠标滚轮移动 35 0 当鼠标有键被按下或者释放 36 */
下面给一个样例程序,实现在控制台窗口缓冲区的最下面一行显示当前鼠标在缓冲区的坐标,单击左键在当前鼠标位置输出字母A,单击右键则输出字母B,双击任何鼠标键退出的功能。程序如下:
1 #include <stdio.h> 2 #include <windows.h> 3 #include <conio.h> 4 5 HANDLE handle_in; 6 HANDLE handle_out; 7 CONSOLE_SCREEN_BUFFER_INFO csbi; //定义窗口缓冲区信息结构体 8 9 void DisplayMousePosition(COORD pos); //显示鼠标所在位置 10 11 void gotoxy(int x, int y); //将光标移到坐标为(x,y)的位置 12 13 int main() 14 { 15 handle_in = GetStdHandle(STD_INPUT_HANDLE); //获得标准输入设备句柄 16 handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄 17 INPUT_RECORD mouserec; //定义输入事件结构体 18 DWORD res; //用于存储读取记录 19 COORD pos; //用于存储鼠标当前位置 20 COORD size = {80, 25}; //窗口缓冲区大小 21 GetConsoleScreenBufferInfo(handle_out, &csbi); //获得窗口缓冲区信息 22 SetConsoleScreenBufferSize(handle_out, size); //设置窗口缓冲区大小 23 for (;;) 24 { 25 ReadConsoleInput(handle_in, &mouserec, 1, &res); //读取输入事件 26 pos = mouserec.Event.MouseEvent.dwMousePosition; //获得当前鼠标位置 27 gotoxy(0, 24); //在第25行显示鼠标位置 28 DisplayMousePosition(pos); //显示鼠标位置 29 if (mouserec.EventType == MOUSE_EVENT) //如果当前为鼠标事件 30 { 31 gotoxy(pos.X, pos.Y); 32 //单击鼠标左键,输出字符A 33 if (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) 34 { 35 putchar('A'); 36 } 37 //单击鼠标右键,输出字符B 38 if (mouserec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED) 39 { 40 putchar('B'); 41 } 42 //双击退出 43 if (mouserec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK) 44 { 45 break; 46 } 47 } 48 } 49 CloseHandle(handle_out); 50 CloseHandle(handle_in); 51 return 0; 52 } 53 54 void DisplayMousePosition(COORD pos) 55 { 56 COORD dis = {0, 24}; //在第24行显示鼠标位置 57 WORD att = FOREGROUND_GREEN | FOREGROUND_INTENSITY; //文本属性 58 GetConsoleScreenBufferInfo(handle_out, &csbi); //获得窗口缓冲区信息 59 printf("X = %3d, Y = %3d", (int)pos.X, (int)pos.Y); 60 FillConsoleOutputAttribute(handle_out, att, 16, dis, NULL); //填充文本属性 61 return; 62 } 63 64 void gotoxy(int x, int y) 65 { 66 COORD pos = {x, y}; 67 SetConsoleCursorPosition(handle_out, pos); 68 }
附上用本程序写的Hello world!的图: