LinuxC 鼠标应用编程 input_event

鼠标事件

  • EV_REL(相对坐标)
  • EV_KEY(按键)

EV_REL用来表示鼠标在屏幕的位置,EV_KEY用来表示鼠标的按钮。

EV_REL类型(相对坐标)

如果事件是相对坐标时,读取到的struct input_event的type字段的值为 2 (EV_REL) ,code字段的取值可能是REL_X(相对坐标X值)、REL_X(相对坐标Y值)、REL_WHEEL(滚轮),value字段根据code的取值不同而不同,可以表示坐标(X值、Y值),滚轮上滑(-1)、下滑(1)

EV_KEY类型(按键:左键、右键、滚轮键)

鼠标事件有四种按键类型,分别表示左键、右键、滚轮键按下/抬起,读取到的struct input_event的type字段的值为 1 (EV_KEY) ,code字段取值可能是BTN_LEFT(左键)、BTN_RIGHT(右键)、BTN_MIDDLE(滚轮键),value字段一般是 1 表示按下,0 表示抬起,

Code

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <linux/input.h>

int judge_sta(int code, int value)//判断按键类型
{
    switch (code)
    {
    case BTN_LEFT:
        if(value == 0)
            return 0;
        else
            return 1;
        break;
    case BTN_RIGHT:
        if(value == 0)
            return 2;
        else
            return 3;
        break;
    case BTN_MIDDLE:
        if(value == 0)
            return 4;
        else
            return 5;
        break;
    default:
        return -1;
        break;
    }

}


int main(int argc, char* argv[])
{
    int fd = open(argv[1], O_RDONLY);

    struct input_event in_ev;
    int valid = 0;
    int down = -1;
    int x = 0, y = 0;
    int flag = 0;
    for( ; ; )
    {
        if (sizeof(struct input_event) == read(fd, &in_ev, sizeof(struct input_event)))
        {
            switch (in_ev.type)
            {
            case EV_KEY:
                down = judge_sta(in_ev.code, in_ev.value);
                valid = 1;
                break;
            case EV_REL:
                switch (in_ev.code) {
                case REL_X: //X坐标
                    x = in_ev.value;
                    valid = 1;
                    break;
                case REL_Y: //Y坐标
                    y = in_ev.value;
                    valid = 1;
                    break;
                case REL_WHEEL://滚轮上下滑动事件
                    if(in_ev.value == -1)
                        down = 6;
                    else
                        down = 7;
                    valid = 1;
                }
            case EV_SYN:
                if(in_ev.code == SYN_REPORT)
                {
                    if(valid == 1)
                    {
                        switch (down) {//判断状态
                        case 0:
                            printf("左键松开\n");
                            break;
                        case 1:
                            printf("左键按下(%d, %d)\n", x, y);
                            break;
                        case 2:
                            printf("右键松开\n");
                            break;
                        case 3:
                            printf("右键按下(%d, %d)\n", x, y);
                            break;
                        case 4:
                            printf("滚轮松开\n");
                            break;
                        case 5:
                            printf("滚轮按下(%d, %d)\n", x, y);
                            break;
                        case 6:
                            printf("滚轮下滑\n");
                            break;
                        case 7:
                            printf("滚轮上滑\n");
                            break;
                        case -1:
                            printf("移动(%d, %d)\n", x, y);
                            break;
                        }
                        valid = 0;
                        down = -1;
                        flag = 0;
                    }
                }
                break;
            default:
                break;
            }
        }
    }
    close(fd);
    return 0;
}
相关推荐
bj_bluewei_tech1 天前
拯救者键盘部分按键失灵,换键盘无效,需要排查主板键盘控制芯片
计算机外设·电脑
qq_513728041 天前
浏览器配置 + 文件上传 + 截图
python·selenium·测试工具·计算机外设
杨丰玮4181 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(四)
java·游戏·计算机外设
YOLO数据集集合1 天前
火情监测新方案:无人机红外-可见光多模态火点烟雾数据集(含YOLOv11实战)
人工智能·yolo·计算机外设·无人机·无人机数据集·可见光多模态
杨丰玮4181 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(二)
java·游戏·计算机外设
码艺-Alimjan2 天前
横向滚动组件纯用 CSS,丝滑鼠标滚动不许js
javascript·css·计算机外设
Nomarsgo3 天前
柔性生产平台工业显示解决方案——基于联控 Lionconit IFD-1901 工业显示器打造高可靠人机交互终端
人工智能·科技·计算机外设·视觉检测·电脑·人机交互·制造
daols884 天前
解决 vxe-table 全键盘操作编辑单元格时,如果是中文拼音输入法时,解决首字母丢失问题
计算机外设
weixin_6685 天前
取消Windows 11 默认精简的鼠标右键文件夹菜单
windows·计算机外设
2601_963906786 天前
显示器 DDC/CI 控制工具:支持自动亮度/对比度调整等高级功能
计算机外设·软件需求