在ubuntu18.04下,通过编程向系统发送组合键

2023-10-08 17:48

本文主要是介绍在ubuntu18.04下,通过编程向系统发送组合键,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在ubuntu18.04下,通过编程向系统发送组合键

实现原理:

    在ubuntu,模拟发送组合键,本文的实现方式,是通过写文件的方式,来模拟键盘事件。在/dev/目录下,有一个“uinput”字符设备文件,我们可以写此文件,来模拟键盘事件。

    向“uinput”文件写一个按钮,则是单键按下,连续写多个按钮,则可以模拟组合键。
在这里插入图片描述

源码:

#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <sys/time.h>
#include <unistd.h>
#include <errno.h>
static void sendCtrl_Alt_Del_Key()
{int uinp_fd = open("/dev/uinput",O_RDWR);if (uinp_fd < 0){//qDebug()<<"unable to open /dev/uinput";return;}if(ioctl(uinp_fd ,UI_SET_EVBIT,EV_KEY)<0) //设置设备所支持的动作,#defineEV_KEY 0x01 // 按下键{//qDebug()<<"unable to set EV_KEY";return;}if(ioctl(uinp_fd ,UI_SET_EVBIT,EV_REP)<0) //设置设备所支持的动作,#defineEV_KEY 0x02 // 释放{//qDebug()<<"unable to set EV_REP";return;}for(int i = 0; i < 256; i++){  //---------------------???????ioctl(uinp_fd , UI_SET_KEYBIT, i);}//创建设备并写入至input子系统struct  uinput_user_dev  uinput;memset(&uinput,0,sizeof(uinput));uinput.id.version = 4;uinput.id.bustype = BUS_USB;strncpy(uinput.name,"virtual device a",UINPUT_MAX_NAME_SIZE);int ret = write( uinp_fd , &uinput, sizeof(uinput) );if(ret<0){//qDebug()<<"unable to write(uinp_fd , &uinput, sizeof(uinput)";return;}int err = ioctl(uinp_fd, UI_DEV_CREATE);if(err < 0){//qDebug()<<"unable to  creat device";return;}//construct input_event and send itstruct input_event event;unsigned int key_code = KEY_LEFTCTRL;  //键值usleep(100000);//importan//unsigned int key_code = KEY_CAPSLOCK;event.type = EV_KEY;event.code = key_code;event.value = 1; //1 means pressed signalgettimeofday(&event.time, NULL);if (write(uinp_fd, &event, sizeof(event)) < 0) {//qDebug()<<"unable to  write key event";return;}event.code  = KEY_LEFTALT;if (write(uinp_fd, &event, sizeof(event)) < 0) {//qDebug()<<"unable to  write key event";return;}event.code  = KEY_DELETE;if (write(uinp_fd, &event, sizeof(event)) < 0) {//qDebug()<<"unable to  write key event";return;}gettimeofday(&event.time, NULL);event.value = 0;// send sync signal///event.type = EV_SYN;event.code = SYN_REPORT;event.value = 0;gettimeofday(&event.time, NULL);if( write(uinp_fd, &event, sizeof(event))<0 )//发送同步信号{//qDebug()<<"unable to  write sync event";return;}close(uinp_fd);
}

这篇关于在ubuntu18.04下,通过编程向系统发送组合键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166967

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重