【C语言】控制台窗口图形界面编程(七):鼠标事件

目录

  • 00. 目录
  • 01. INPUT_RECORD结构
  • 02. MOUSE_EVENT_RECORD结构
  • 03. ReadConsoleInput函数
  • 04. 示例程序

00. 目录

01. INPUT_RECORD结构

描述控制台输入缓冲区中的输入事件。可以使用ReadConsoleInputPeekConsoleInput函数从输入缓冲区读取这些记录,也可以使用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;
}

原文地址:https://www.cnblogs.com/szitcast/p/10924270.html

时间: 2024-08-27 20:16:13

【C语言】控制台窗口图形界面编程(七):鼠标事件的相关文章

C语言控制台窗口图形界面编程(八):鼠标事件

<知识分享> 上次讲的是键盘事件,这次我们介绍鼠标事件.下面先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD      //鼠标事件结构体 { COORD dwMousePosition;      //当前鼠标在控制台窗口缓冲区的位置 DWORD dwButtonState;        //鼠标按键的状态 DWORD dwControlKeyState;    //控制键状态 DWORD dwEventFlags;       

C语言控制台窗口图形界面编程(一)

本系列文章改编自<C语言控制台窗口界面编程(修正版)>.本系列文章会抛弃一些原文中难懂难理解且不常用的部分,并修改了部分样例程序.只为了更加清晰地学习C语言的控制台窗口界面编程.而想要更加深入的了解本系列文章,请阅读<C语言控制台窗口界面编程(修正版)>. <C语言控制台窗口界面编程(修正版)>下载地址:http://download.csdn.net/detail/jzqt_t/7471013 在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输

C语言控制台窗口图形界面编程(二)

下面介绍几个用于控制台窗口操作的API函数,如下: [cpp] view plaincopy //获取控制台窗口信息 GetConsoleScreenBufferInfo(); //获取控制台窗口标题 GetConsoleTitle(); //更改指定缓冲区大小 SetConsoleScreenBufferSize(); //设置控制台窗口标题 SetConsoleTitle(); //设置控制台窗口信息 SetConsoleWindowInfo(); 下面的示例程序用于说明此类函数的使用: [

C语言控制台窗口图形界面编程(三)

<知识分享> 在这里介绍一个设置文本属性的函数,原型如下 [cpp] view plaincopy BOOL SetConsoleTextAttribute(   // 设置WriteConsole等函数的字符属性 HANDLE hConsoleOutput,          // 句柄 WORD wAttributes                // 文本属性 ); 顺便提一下文本属性,其实就是颜色属性,有背景色和前景色(就是字符的颜色)两类,每一类只提供三原色(红,绿,蓝)和加强色(

C语言控制台窗口图形界面编程(五).

控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer(             //文本移动函数 HANDLE hConsoleOutput,                  //句柄 const SMALL_RECT *lpScrollRectangle,    //移动区域 const SMALL_RECT *lpClipRectangle,    

C语言控制台窗口图形界面编程(总结)

<知识分享(来自我的CSDN)>   :http://blog.csdn.net/jzqt_t/article/details/32225195 本系列文章是笔者通过学习<C语言控制台窗口界面编程(修正版)>而写(关于此文档的更多信息请看本系列文章第一篇),旨在让大家更加清晰简洁容易地学习C语言控制台窗口界面的编程. 通过本系列文章我们可以在控制台窗口中制作好看的图形界面,方便了在非TC开发环境中的控制台窗口中进行文本界面和图形界面的设计,有利于向Windows应用程序开发过渡.也

C语言控制台窗体图形界面编程(总结)

本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本系列文章我们能够在控制台窗体中制作好看的图形界面,方便了在非TC开发环境中的控制台窗体中进行文本界面和图形界面的设计,有利于向Windows应用程序开发过渡.也能够通过学习这些东西写些好玩的经典游戏比方贪吃蛇,扫雷和俄罗斯方块等. 事实上这些编程技巧并不算是C语言的.事实上,它仅仅只是是通过调用Windows

【C语言】控制台窗口图形界面编程(五):文本移动

目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 指定Unicode或ANSI字符及其属性.控制台功能使用此结构来读取和写入控制台屏幕缓冲区. 类型声明 typedef struct _CHAR_INFO { union { WCHAR UnicodeChar; CHAR AsciiChar; } Char; WORD Attributes; }

【C语言】控制台窗口图形界面编程(八):键盘事件

目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT_RECORD结构 描述控制台输入缓冲区中的输入事件.可以使用ReadConsoleInput或PeekConsoleInput函数从输入缓冲区读取这些记录,也可以使用WriteConsoleInput函数将这些记录写入输入缓冲区. 类型声明: typedef struct _INPUT_RECOR