加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.com/)- 科技、建站、内容创作、云计算、网络安全!
当前位置: 首页 > 综合聚焦 > Linux > 正文

钩入linux的关键事件处理

发布时间:2021-03-30 15:09:17 所属栏目:Linux 来源:互联网
导读:我想挂钩进 linux桌面键事件处理. 按CapsLock应该输入某种命令行. 我要实现的一些命令: d / x:从当前光标位置删除直到字符x为止. (灵感来自vi) a:转到行首,像pos1. (灵感来自于emacs). k:删除直到行尾. (灵感来自于emacs). … 命令应该在任何文本字段中工

我想挂钩进 linux桌面键事件处理.

按CapsLock应该输入某种命令行.

我要实现的一些命令:

> d / x:从当前光标位置删除直到字符x为止. (灵感来自vi)
a:转到行首,像pos1. (灵感来自于emacs).
> k:删除直到行尾. (灵感来自于emacs).
> …

命令应该在任何文本字段中工作:浏览器,邮件客户端,gnome终端,…

AFAIK低级xmodmap将不会帮助我.

有可能吗?

我需要在哪里放钩子?

目前的平台是Ubuntu> = 14.04

背景:我想把手指放在F和J上,使用电脑而不看键盘.几年来为A-Z工作,但像Pos1 / End这样的键不容易访问.

如果您不了解这个问题的一部分,请发表评论.谢谢.

更新

这个问题只是关于如何挂钩关键的事件处理.其他的东西(命令行)是一个不同的主题.你如何抓住例如CapsLock x?

UPDATE2
我看到没有简单直接的解决方案.如果你没有答案,但你知道我可以在哪里找到更多的帮助(比如在邮件列表FOO上询问),请告诉我.

UPDATE3
由于有些人不明白我想要什么,我试图解释一下:如果我使用emacs或bash,我觉得像电脑一样控制:就像飞行一样,只有很少的动作,我可以告诉电脑做什么我想要.在webbrowser textarea,LibreOffice或使用thunderbird中编辑文本会使这种感觉消失.光标移动很麻烦,不觉得飞行.我想控制桌面,而不只是一个应用程序,并保持我的手指指向F和J键.

解决方法

UPDATE

而不是告诉X服务器忽略该设备,您可以使用EVIOCGRAB ioctl,我添加到下面的程序中.

你需要做以下事情:

1.确认您已将CONFIG_UINPUT模块编译并加载.我相信Ubuntu已经有了.如果没有看到/ dev / uinput设备,请尝试运行modprobe -v uinput来加载模块.

2.以root身份运行以下程序,并给它键盘设备的路径,例如:

./process / dev / input / by-id / usb-Microsoft_Wired_Keyboard_600-event-kbd

以下程序创建一个名为uinput-sample的假输入设备,并将所有事件从给定的输入设备转发给它.我从http://thiemonge.org/getting-started-with-uinput给出的样本进行了调整

你可以修改它来做你想要做的事情.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/uinput.h>

#define die(str,args...) do { 
        perror(str); 
        exit(EXIT_FAILURE); 
    } while(0)

int
main(int argc,char* argv[])
{
    int                    fdo,fdi;
    struct uinput_user_dev uidev;
    struct input_event     ev;
    int                    i;

    if(argc != 2) die("error: specify input device");

    fdo = open("/dev/uinput",O_WRONLY | O_NONBLOCK);
    if(fdo < 0) die("error: open");

    fdi = open(argv[1],O_RDONLY);
    if(fdi < 0) die("error: open");

    if(ioctl(fdi,EVIOCGRAB,1) < 0) die("error: ioctl");

    if(ioctl(fdo,UI_SET_EVBIT,EV_SYN) < 0) die("error: ioctl");
    if(ioctl(fdo,EV_KEY) < 0) die("error: ioctl");
    if(ioctl(fdo,EV_MSC) < 0) die("error: ioctl");

    for(i = 0; i < KEY_MAX; ++i)
        if(ioctl(fdo,UI_SET_KEYBIT,i) < 0) die("error: ioctl");

    memset(&uidev,sizeof(uidev));
    snprintf(uidev.name,UINPUT_MAX_NAME_SIZE,"uinput-sample");
    uidev.id.bustype = BUS_USB;
    uidev.id.vendor  = 0x1;
    uidev.id.product = 0x1;
    uidev.id.version = 1;

    if(write(fdo,&uidev,sizeof(uidev)) < 0) die("error: write");
    if(ioctl(fdo,UI_DEV_CREATE) < 0) die("error: ioctl");

    while(1)
    {
        if(read(fdi,&ev,sizeof(struct input_event)) < 0)
            die("error: read");

        ev.time.tv_sec = 0;
        ev.time.tv_usec = 0;

        if(write(fdo,sizeof(struct input_event)) < 0)
            die("error: write");
    }

    if(ioctl(fdo,UI_DEV_DESTROY) < 0) die("error: ioctl");

    close(fdi);
    close(fdo);

    return 0;
}

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读