00. 目录
文章目录
00. 目录01. INPUT_RECORD结构02. MOUSE_EVENT_RECORD结构03. ReadConsoleInput函数04. 示例程序01. INPUT_RECORD结构
描述控制台输入缓冲区中的输入事件。可以使用ReadConsoleInput或PeekConsoleInput函数从输入缓冲区读取这些记录,也可以使用WriteConsoleInput函数将这些记录写入输入缓冲区。
类型声明:
typedef struct _INPUT_RECORD {WORD EventType;union {KEY_EVENT_RECORDKeyEvent;MOUSE_EVENT_RECORD MouseEvent;WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;MENU_EVENT_RECORD MenuEvent;FOCUS_EVENT_RECORD FocusEvent;} Event;} INPUT_RECORD;
EventType
输入事件类型的句柄和存储在Event成员中的事件记录。
该成员可以是以下值之一。
事件
事件信息。此成员的格式取决于EventType成员指定的事件类型。
02. MOUSE_EVENT_RECORD结构
描述控制台INPUT_RECORD结构中的鼠标输入事件。
类型声明:
typedef struct _MOUSE_EVENT_RECORD {COORD dwMousePosition;DWORD dwButtonState;DWORD dwControlKeyState;DWORD dwEventFlags;} MOUSE_EVENT_RECORD;
成员说明
dwMousePosition
一个COORD结构,它根据控制台屏幕缓冲区的字符单元格坐标包含光标的位置。
dwButtonState
鼠标按钮的状态。最低有效位对应于最左边的鼠标按钮。下一个最低有效位对应于最右边的鼠标按钮。下一位表示从左到右的鼠标按钮。然后,这些位从左到右对应鼠标按钮。如果按下按钮,则位为1。
为前五个鼠标按钮定义了以下常量。
dwControlKeyState
控制键的状态。该成员可以是以下一个或多个值。
dwEventFlags
鼠标事件的类型。如果此值为零,则表示正在按下或释放鼠标按钮。否则,此成员是以下值之一。
03. ReadConsoleInput函数
从控制台输入缓冲区读取数据并将其从缓冲区中删除。
函数声明:
BOOL WINAPI ReadConsoleInput(_In_ HANDLE hConsoleInput,_Out_ PINPUT_RECORD lpBuffer,_In_ DWORD nLength,_Out_ LPDWORD lpNumberOfEventsRead);功能:从控制台输入缓冲区读取数据并将其从缓冲区中删除。参数:hConsoleInput 控制台输入缓冲区的句柄。句柄必须具有GENERIC_READ访问权限。lpBuffer 指向接收输入缓冲区数据的INPUT_RECORD结构数组的指针。nLength 数组元素中lpBuffer参数 指向的数组大小。lpNumberOfEventsRead 指向接收读取的输入记录数的变量的指针。返回值:如果函数成功,则返回值为非零值。如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
官方参考网址:/en-us/windows/console/readconsoleinput
04. 示例程序
#include<stdio.h>#include<string.h>#include<stdlib.h>#include <Windows.h>#include <conio.h>int main(void){//定义句柄变量HANDLE hOut = NULL;HANDLE hIn = NULL;//定义输入事件结构体INPUT_RECORD mouseRecord;//用于存储读取记录DWORD res;//用于存储鼠标当前位置COORD pos;//获取标准输出句柄hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输入句柄hIn = GetStdHandle(STD_INPUT_HANDLE);while (1){//读取输入事件ReadConsoleInput(hIn, &mouseRecord, 1, &res);//获取鼠标当前位置pos = mouseRecord.Event.MouseEvent.dwMousePosition;//如果当前事件是鼠标事件if (mouseRecord.EventType == MOUSE_EVENT){//单击鼠标左键if (mouseRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){printf("鼠标左键单击 x: %d y: %d\n", pos.X, pos.Y);}//单击鼠标右键if (mouseRecord.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED){printf("鼠标右键单击 x: %d y: %d\n", pos.X, pos.Y);}//如果是双击就退出循环if (mouseRecord.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK){break;}}}//关闭句柄CloseHandle(hOut);CloseHandle(hIn);//system("pause");getchar();return 0;}