钩入linux的关键事件处理

钩入linux的关键事件处理,第1张

概述我想挂钩进 linux桌面键事件处理. 按CapsLock应该输入某种命令行. 我要实现的一些命令: > d / x:从当前光标位置删除直到字符x为止. (灵感来自vi) a:转到行首,像pos1. (灵感来自于emacs). > k:删除直到行尾. (灵感来自于emacs). > … 命令应该在任何文本字段中工作:浏览器,邮件客户端,gnome终端,… AFAIK低级xmodmap将不会帮助我. 我想挂钩进 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)intmain(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;}
总结

以上是内存溢出为你收集整理的钩入linux的关键事件处理全部内容,希望文章能够帮你解决钩入linux的关键事件处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048660.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存