[Linux] C获取键盘,鼠标数据

这篇具有很好参考价值的文章主要介绍了[Linux] C获取键盘,鼠标数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

键盘检测指令:cat /dev/input/event1 | hexdump

鼠标检测指令:cat /dev/input/event2 | hexdump

当键盘/鼠标有输入时,会有对应的一堆16进制输出。它其实对应着input_event结构体【24字节】。

struct input_event 
{
      struct timeval time;
      __u16 type;
      __u16 code;
      __s32 value;
};
//==================获取键盘数据====================
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <string.h>
 
int main(void)
{
    #define KEY_PATH	"/dev/input/event1"
	int fd = -1, ret = -1;
	struct input_event ev;
	// 第1步:打开设备文件
	fd = open(KEY_PATH, O_RDONLY);
	if (fd < 0)
	{
		perror("open,error");
		return -1;
	}
    printf("welcome size=%d.\n",sizeof(struct input_event));
	
	while (1)
	{
		// 第2步:读取event事件包
		memset(&ev, 0, sizeof(struct input_event));
		ret = read(fd, &ev, sizeof(struct input_event));
		if (ret != sizeof(struct input_event))
		{
			perror("read,error");
			close(fd);
			return -1;
		}
		
		// 第3步:解析event包.
        printf("========================================================\n");
		printf("[%11u] type: %3d, code: %3d, value: %3d \n",ev.time.tv_sec,ev.type,ev.code,ev.value);
        //type: 1:按键同步
        //code: 键码['a'=30]
        //value:0:按键释放,1:按键按下,2:长按下
	}
 
	// 第4步:关闭设备
	close(fd);	
	return 0;
}
//=======获取鼠标数据=========
#include <X11/Xlib.h>
//LDFLAGS := -lX11
int GetDisplayInfo(int *screen_width,int *screen_height)
{
    Display *display = XOpenDisplay(NULL);
    if (display == NULL)
    {
        printf("Error: cannot open display\n");
        return 1;
    }
    int screen_num = DefaultScreen(display);
    Screen *screen = ScreenOfDisplay(display, screen_num);
    *screen_width = WidthOfScreen(screen);
    *screen_height = HeightOfScreen(screen);
    printf("Screen size: %dx%d pixels\n", WidthOfScreen(screen), HeightOfScreen(screen));
    printf("Screen resolution: %dx%d dpi\n", (int) (WidthOfScreen(screen) * 25.4 / DisplayWidthMM(display, screen_num)), 
                                             (int) (HeightOfScreen(screen) * 25.4 / DisplayHeightMM(display, screen_num)));
    XCloseDisplay(display);
    
    return 0;
}

int get_xy(int fd,struct input_event ts,int *x,int *y)
{
    static int nCnt = 0;
	read(fd,&ts,sizeof(ts));
	if(ts.type == EV_ABS && ts.code == ABS_X)
	{
		*x = ts.value;
        nCnt = (nCnt+1)%3;
		return nCnt;
	}
	if(ts.type == EV_ABS && ts.code == ABS_Y)
	{
		*y = ts.value;
        nCnt = (nCnt+1)%3;
		return nCnt;
	}
	
	return 0;
}


int main(void)
{
   #define MOUSE_PATH	"/dev/input/event2"
	int fd = -1, ret = -1;
	struct input_event ev;
    int data_size = sizeof(struct input_event);

	// 第1步:打开设备文件[需要权限运行]
	fd = open(MOUSE_PATH, O_RDONLY);
	if (fd < 0)
	{
		perror("open,error");
		return -1;
	}
    printf("mouse test [%s],data size=%d.\n",MOUSE_PATH,sizeof(struct input_event));
	
    int screen_width = 0;
    int screen_height = 0;
    if( GetDisplayInfo(&screen_width,&screen_height)>0)
    {
        perror("get display info,error");
        return -2;
    }

	while (1)
	{

       static int raw_x=0;
       static int raw_y=0;
        int tmp =0;

		tmp = get_xy(fd,ev,&raw_x,&raw_y);
        if(tmp==2)
        {
            int curr_x = 0;
            int curr_y = 0;
            curr_x = raw_x*screen_width/0xFFFF;
            curr_y = raw_y*screen_height/0xFFFF;
            printf("mousePos: x=%d,y=%d.\n",curr_x,curr_y);
        }
	}
	close(fd);	
	return 0;
}

方法2:采用SDL2 [simplle directmedia layer]  , 此方法用于GUI项目,事件只针对SDL创建的窗口内有效文章来源地址https://www.toymoban.com/news/detail-674595.html

#include <stdio.h>
#include <SDL2/SDL.h>

#define SDL_HOR_RES (800)
#define SDL_VER_RES (600)

typedef struct TagMonitor
{
    int screen_w;
    int screen_h;
    SDL_Renderer *render;
    SDL_Texture *texture;
} tagMonitor;

// 将屏幕设置成指定ARGB颜色
int update_win(tagMonitor *mt, uint32_t argb)
{
    uint32_t fb_data[SDL_HOR_RES * SDL_VER_RES]; // frame buffer data[w*h]
    for (size_t i = 0; i < SDL_HOR_RES * SDL_VER_RES; i++)
    {
        fb_data[i] = argb;
    }

    SDL_UpdateTexture(mt->texture, NULL, fb_data, mt->screen_w * 4);
    SDL_RenderClear(mt->render);
    // 设定渲染的目标区域
    SDL_Rect destRect;
    destRect.x = 0;
    destRect.y = 0;
    destRect.w = mt->screen_w;
    destRect.h = mt->screen_h;

    // 复制材质到渲染器对象
    if (SDL_RenderCopy(mt->render, mt->texture, NULL, &destRect))
    {
        printf("Error,%s \n", SDL_GetError());
        return -1;
    }
    // 执行渲染操作
    SDL_RenderPresent(mt->render);
    return 0;
}

到了这里,关于[Linux] C获取键盘,鼠标数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Linux] C获取键盘输入值

    键盘检测指令:cat /dev/input/event1 | hexdump 鼠标检测指令:cat /dev/input/event2 | hexdump 当键盘/鼠标有输入时,会有对应的一堆16进制输出。它其实对应着input_event结构体【24字节】。 方法2: 采用SDL2 [simplle directmedia layer]  , 此方法用于GUI项目,事件只针对SDL创建的窗口内有效

    2024年02月12日
    浏览(28)
  • Linux系统struct input_event结构体分类型(鼠标、键盘、触屏)详解与例子

    目录 一、概述 二、结构体字段解析 三、不同类型地解释字段  3.1 鼠标事件  3.2 键盘事件  3.3 触摸屏事件 四、使用 struct input_event 读取设备文件的例子 Linux系统是通过 输入子系统 来管理输入设备(如鼠标、键盘、触摸屏、游戏摇杆)的。配置了内核支持且安装对应驱动

    2024年02月16日
    浏览(42)
  • Linux C语言开发(二)C语言数据类型

    目录 一.C语言概述 1.1 什么是C语言 1.2 C语言与Linux 1.3 C语言的特点 二.数据类型

    2024年01月17日
    浏览(39)
  • 【Linux】腾讯云服务器(Linux版)如果获取UUID(通用唯一标识符)

    实例元数据包括UUID、实例ID、MAC编号等等,可以通过如下接口查看元数据列表 https://cloud.tencent.com/document/product/213/4934

    2024年02月10日
    浏览(39)
  • 安装黑苹果进入语言选择界面,鼠标/键盘无法使用?

    是因为 EFI 文件中没有 USB 驱动,或你使用的 EFI 文件定制了 USB 端口,但和你的主板不匹配。可以放一个 USBInjectAll.kext 到 EFI/Clover/Kexts/other ( Clover 方式),或 EFI/OC/Kexts ( OpenCore 方式),并删除同目录下的 USBPorts.kext ,或删除 ACPI/Patched 下的 ssdt-uiac.aml ( OpenCore 在 ACPI 目录,也可能

    2024年02月12日
    浏览(39)
  • linux高并发web服务器开发(web服务器)18_函数解析http请求, 正则表达式,sscanf使用,http中数据特殊字符编码解码

    pdf详情版 编写函数解析http请求 ○ GET /hello.html HTTP/1.1rn ○ 将上述字符串分为三部分解析出来 编写函数根据文件后缀,返回对应的文件类型 sscanf - 读取格式化的字符串中的数据 ○ 使用正则表达式拆分 ○ [^ ]的用法 通过浏览器请求目录数据 ○ 读指定目录内容  opendir 

    2024年02月16日
    浏览(56)
  • Linux c语言获取本机网关 ip 地址

    这篇文章写了获取本机的ip地址和子网掩码:Linux c语言获取本机 ip、子网掩码 关于Netlink套接字请参考:Linux 网络之netlink 简介 Linux Netlink套接字是一种用于在Linux内核和用户空间之间进行通信的机制。它是Linux内核中的一种通信协议,用于让用户空间程序与内核进行交互。使用

    2024年02月07日
    浏览(46)
  • linux嵌入式开发-Zynq开发板配置usb_gadget模拟HID鼠标

    在PC上使用VMWare,在ubuntu下创建petalinux工程,编译内核,vmware、vivdado、petalinux的安装详见alinx官方教程course4-linux实验中的步骤 创建petalinux工程,在工程目录下打开终端,输入命令准备编译内核 然后编译内核: 进入Devicedrivers - USB Support,勾选USB Gadget Support(按Y) 进入USB Gadge

    2024年02月04日
    浏览(53)
  • Linux c语言获取本机 ip、子网掩码

    ifconfig 命令查询本机的网络接口名称,然后运行程序时加上输入参数:网络接口名称。 使用 ioctl() 函数获取本机IP地址的方法。该方法通过查询指定网络接口的IP地址,获取本机的IP地址。 (1)创建一个基于IP协议的socket。 创建了一个套接字,使用了 socket() 系统调用。socke

    2024年02月16日
    浏览(37)
  • Linux socket 搭建TCP服务器(C语言)

    ​ 在标题之前,先提几个问题,方便下次查看理解。 什么是TCP TCP服务器需要用到哪些函数 如何简单的搭建一个TCP服务器 ​ TCP 是一种传输层协议,可以提供可靠的数据传输服务。它是面向连接的,具有可靠性、流量控制、拥塞控制以及双工通信的特点。 1. socket ​ socket 作

    2024年04月17日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包