【C语言】控制台窗口图形界面编程(七):鼠标事件
00. 目录
01. INPUT_RECORD结构
描述控制台输入缓冲区中的输入事件。可以使用ReadConsoleInput或PeekConsoleInput函数从输入缓冲区读取这些记录,也可以使用WriteConsoleInput函数将这些记录写入输入缓冲区。
类型声明:
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 | 该事件成员包含一个FOCUS_EVENT_RECORD结构。这些事件在内部使用,应该被忽略。 |
| KEY_EVENT 0x0001 | 该事件成员包含一个KEY_EVENT_RECORD结构有关键盘事件的信息。 |
| MENU_EVENT 0x0008 | 该事件成员包含一个MENU_EVENT_RECORD结构。这些事件在内部使用,应该被忽略。 |
| MOUSE_EVENT 0x0002 | 所述事件构件包含MOUSE_EVENT_RECORD结构用约鼠标移动或按键按压事件的信息。 |
| WINDOW_BUFFER_SIZE_EVENT 0x0004 | 该事件成员包含一个WINDOW_BUFFER_SIZE_RECORD结构有关控制台屏幕缓冲区的新大小信息。 |
事件
事件信息。此成员的格式取决于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。
为前五个鼠标按钮定义了以下常量。
| 值 | 含义 |
|---|---|
| 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。
官方参考网址:https://docs.microsoft.com/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;
}
【C语言】控制台窗口图形界面编程(七):鼠标事件的更多相关文章
- C语言控制台窗体图形界面编程(总结)
本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...
- C语言控制台窗体图形界面编程(八):鼠标事件
上次讲的是键盘事件,这次我们介绍鼠标事件. 以下先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 { CO ...
- 【C语言】控制台窗口图形界面编程(一)句柄和文本属性
目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制颜色对照表 06. ...
- 【C语言】控制台窗口图形界面编程(五):文本移动
目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 ...
- 【C语言】控制台窗口图形界面编程(四):文本输出
目录 00. 目录 01. FillConsoleOutputAttribute函数 02. FillConsoleOutputCharacter函数 03. WriteConsoleOutputCh ...
- 【C语言】控制台窗口图形界面编程(八):键盘事件
目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT ...
- 【C语言】控制台窗口图形界面编程(六):光标设置
目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...
- Linux C 程序 GTK+图形界面编程(22)
GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...
随机推荐
- bzoj3696
3696: 化合物 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 245 Solved: 131[Submit][Status][Discuss] ...
- Linux 平台下阅读源码的工具链
原文:http://blog.jobbole.com/101322/ 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码. 在Win ...
- 真正认识 realloc 的工作方式(转载)
转自:http://www.cnblogs.com/ren54/archive/2008/11/20/1337545.html realloc 用过很多次了.无非就是将已经存在的一块内存扩大. cha ...
- linux更改用户名,域名(转载)
转自:http://huangro.iteye.com/blog/365975 1. 我们在root权限下,使用命令: usermod -l new_user_name old_user_name 即 ...
- bzoj 2245 [SDOI2011]工作安排【最小费用最大流】
其实不用拆点,对于每个人我们假装他是\( s[i]+1 \)个点,可以由他向T点分别连\( s[i]+1 \)条边,容量为\( t[i][j]-t[i][j-1]\),由S点向所有产品i连容量为c[i ...
- [Usaco2008 Dec]Hay For Sale 购买干草
Description 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一 ...
- 《linux就该这么学》学习笔记
本篇文章是根据刘遄老师的<linux就该这么学>中个人易忘知识点的读书笔记,结合的是个人弱点,可能不适合广大的网友同学,并在此声明本篇文章只是用于学习之用,绝无侵犯版权之意 linux就该 ...
- 洛谷 P1430 序列取数
如果按照http://www.cnblogs.com/hehe54321/p/loj-1031.html的$O(n^3)$做法去做的话是会T掉的,但是实际上那个做法有优化的空间. 所有操作可以分解为由 ...
- java的构造方法 this 重载
this1.隐含的局部变量在方法中指向调用该方法的对象()使用:当成员变量与局部变量同名的时候,通过this说明哪一个是成员变量.(this指向的是成员变量) 2.作为当前类的构造方法名存在作用:在构 ...
- 【小程序】基于.NET CORE2.1 的 微信开放平台 第三方平台开发 教程一 准备工作
微信第三方平台概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认 ...