[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-661154.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语言实现简单的FTP(服务器/客户端)

    前言 跟着上官社长 陈哥花了一个月的时间终于把Linux系统编程学的差不多了,这一个月真的是头疼啊,各种bug,调的真心心累,不过好在问题都解决掉了,在此也感谢一下答疑老师,给我提供了很多的思路,本文章是对前段时间学习Linux,做一个小小的总结,才疏学浅,只学

    2024年02月12日
    浏览(73)
  • 迁移Linux服务器用户数据(将一个服务器的Linux用户数据迁移到另一个Linux服务器用户的流程)

    先来到根目录,再使用tar命令打包数据: tar czvf root.zip.gz ./* 在根目录使用指令: scp 打包好的数据 用户@ip:目的用户下的某个目录 源Linux服务器用户 : 查看压缩包是否到达: 对收到的数据进行解压,使用指令 tar xzvf root.zip.gz 解压到当前目录下。 目的Linux服务器用户 : 看到

    2024年02月08日
    浏览(50)
  • 【Linux学习笔记】Linux服务器:配置与管理samba服务器

    一、【linux学习笔记】红帽Linux 7.8系统在虚拟机上的安装 二、【Linux学习笔记】Linux系统的基本操作  三、【Linux学习笔记】管理Linux操作系统:用户管理  四、【Linux学习笔记】管理Linux操作系统:磁盘管理 五、【Linux学习笔记】管理Linux操作系统:软件安装  六、 【Linux学习

    2024年02月02日
    浏览(49)
  • linux服务器禁止ping命令,linux服务器禁ping如何解除

      我是艾西,在我们搭建网站或做某些程序时,不少人会问禁ping是什么意思,怎么操作的对于业务有哪些好处等,今天艾西一次给你们说清楚。 禁PING的意思是:不允许电脑、设备或服务器使用PING功能。一般情况下电脑、防火墙、服务器都是允许PING功能的,不需要特别设置

    2023年04月20日
    浏览(50)
  • 【Linux】云服务器搭建Linux环境

    目录 🍊一.环境选择🍊 🍎二.购买云服务器🍎 🍏三.使用XShell远程登录云服务器🍏 1.下载XShell 2.进入授权界面,填写姓名和邮件,选择只需Xshell   3.填写信息后,会将下载链接发到邮件,点击链接下载安装即可 4.进入XShell ,使用命令行方式远程登录云服务器          

    2024年02月04日
    浏览(66)
  • Java中将本服务器的文件拷贝到另一个服务器(Linux to Linux)

    在Java中,将文件从一个服务器复制到另一个服务器,你可以使用Secure Copy(SCP)进行操作。Java中的 JSch 库可以进行此操作。 首先,需要添加 JSch 库依赖到你的项目中。如果你使用的是Maven,可以添加以下依赖: 以下是一个使用 JSch 进行SCP操作的示例: 这段代码首先创建了一

    2024年02月13日
    浏览(64)
  • 微信小程序控制台 报错 对应的服务器证书无效 控制台输入 showRequestInfo() 可以获取更详细信息 原因是ssl证书过期 重新申请即可

    微信小程序控制台 报错 对应的服务器证书无效。控制台输入 showRequestInfo() 可以获取更详细信息 报错原因:域名下的SSL证书过期 我这边报错的原因是ssl证书过期 重新申请后就好了,但也有本身域名申请的就有问题的,重新根据规范去申请域名 解决方式:重新申请SSL证书 如

    2024年02月12日
    浏览(53)
  • 【Linux】主机搭建 Linux服务器环境 笔记

    过年买了个 mini 主机当玩具玩一下,这里记录下。 已有主力机 (windows) 的情况下,使用过如下四种 Linux宿主环境。这里总结下区别。 优点 云服务器 虚拟机 笔记本电脑 mini主机 价格低 √ √ 便携 √ √ 环境隔离 √ √ √ 详细过程不贴出来了,把关键点回忆一下,方便以后快

    2024年02月21日
    浏览(66)
  • Linux服务器扩容

    以下就是Linux根目录扩容操作步骤,跟着你也一定能操作成功 首先检查服务器是不是lvm卷,若是lvm跟着文档操作即可,不是请参考其他文档 1、查询磁盘 2、查看磁盘使用情况 3、查询磁盘 4、创建逻辑分区 5、刷新磁盘分区 6、在查看下 lsblk 这里可以看到vda3创建完成了 7、通过

    2024年02月17日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包