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

Posted 好儿郎-志在四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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 it
    struct 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 signal
    gettimeofday(&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下,通过编程向系统发送组合键的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu18.04下Kafka安装与部署

让Ubuntu 18.04系统支持root用户登录的方法

QT应用编程: ubuntu18.04下QT5.13搭建Android开发环境(配件齐全)

QT应用编程: ubuntu18.04下QT5.13搭建Android开发环境(配件齐全)

Ubuntu18.04下安装配置AndroidStudio软件图文教程

windows7下安装ubuntu18.04 双系统