博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C语言】控制台窗口图形界面编程(七):鼠标事件
阅读量:5108 次
发布时间:2019-06-13

本文共 3898 字,大约阅读时间需要 12 分钟。

目录

00. 目录

01. INPUT_RECORD结构

描述控制台输入缓冲区中的输入事件。可以使用或函数从输入缓冲区读取这些记录,也可以使用函数将这些记录写入输入缓冲区。

类型声明:

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;

EventType

输入事件类型的句柄和存储在Event成员中的事件记录。

该成员可以是以下值之一。

含义
FOCUS_EVENT 0x0010 事件成员包含一个结构。这些事件在内部使用,应该被忽略。
KEY_EVENT 0x0001 事件成员包含一个结构有关键盘事件的信息。
MENU_EVENT 0x0008 事件成员包含一个结构。这些事件在内部使用,应该被忽略。
MOUSE_EVENT 0x0002 所述事件构件包含结构用约鼠标移动或按键按压事件的信息。
WINDOW_BUFFER_SIZE_EVENT 0x0004 事件成员包含一个结构有关控制台屏幕缓冲区的新大小信息。

事件

事件信息。此成员的格式取决于EventType成员指定的事件类型。

02. MOUSE_EVENT_RECORD结构

描述控制台结构中的鼠标输入事件。

类型声明:

typedef struct _MOUSE_EVENT_RECORD {  COORD dwMousePosition;  DWORD dwButtonState;  DWORD dwControlKeyState;  DWORD dwEventFlags;} MOUSE_EVENT_RECORD;

成员说明

dwMousePosition

一个结构,它根据控制台屏幕缓冲区的字符单元格坐标包含光标的位置。

dwButtonState

鼠标按钮的状态。最低有效位对应于最左边的鼠标按钮。下一个最低有效位对应于最右边的鼠标按钮。下一位表示从左到右的鼠标按钮。然后,这些位从左到右对应鼠标按钮。如果按下按钮,则位为1。

为前五个鼠标按钮定义了以下常量。

含义
FROM_LEFT_1ST_BUTTON_PRESSED 0x0001 最左边的鼠标按钮。一般来说鼠标左键
FROM_LEFT_2ND_BUTTON_PRESSED 0x0004 左起第二个按钮。一般来说是鼠标中键,就是滚轮键
FROM_LEFT_3RD_BUTTON_PRESSED 0x0008 左起第三个按钮。
FROM_LEFT_4TH_BUTTON_PRESSED 0x0010 左起第四个按钮。
RIGHTMOST_BUTTON_PRESSED 0x0002 最右边的鼠标按钮。一般来说鼠标右键

dwControlKeyState

控制键的状态。该成员可以是以下一个或多个值。

含义
CAPSLOCK_ON 0x0080 大写锁定被打开
ENHANCED_KEY 0x0100 扩展键被按下
LEFT_ALT_PRESSED 0x0002 按下左ALT键。
LEFT_CTRL_PRESSED 0x0008 按下左CTRL键。
NUMLOCK_ON 0x0020 数字锁定被打开
RIGHT_ALT_PRESSED 0x0001 按下右ALT键。
RIGHT_CTRL_PRESSED 0x0004 按下右CTRL键。
SCROLLLOCK_ON 0x0040 滚动锁定被打开
SHIFT_PRESSED 0x0010 按下SHIFT键。

dwEventFlags

鼠标事件的类型。如果此值为零,则表示正在按下或释放鼠标按钮。否则,此成员是以下值之一。

含义
DOUBLE_CLICK 0x0002 双击的第二次单击(按下按钮)发生。第一次单击作为常规按钮事件返回。
MOUSE_HWHEELED 0x0008 水平鼠标滚轮被移动了。如果dwButtonState成员的高位字包含正值,则轮子向右旋转。否则,车轮向左旋转。
MOUSE_MOVED 0x0001 发生了鼠标位置的变化。
MOUSE_WHEELED 0x0004 垂直鼠标滚轮被移动。如果dwButtonState成员的高位字包含正值,则轮向前旋转,远离用户。否则,车轮向后旋转,朝向用户。

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。

官方参考网址:

04. 示例程序

#include
#include
#include
#include
#include
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;}

转载于:https://www.cnblogs.com/szitcast/p/10924270.html

你可能感兴趣的文章
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
iframe跨域与session失效问题
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
Hash和Bloom Filter
查看>>
python常用函数
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
[HDU3683 Gomoku]
查看>>
【工具相关】iOS-Reveal的使用
查看>>
数据库3
查看>>
存储分类
查看>>
下一代操作系统与软件
查看>>
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>