`

Linux 虚拟鼠标,键盘

 
阅读更多

Linux 有自己的 input 子系统,可以统一管理鼠标和键盘事件。
基于输入子系统 实现的 uinput 可以方便的在用户空间模拟鼠标和键盘事件。
当然,也可以自己造轮子, 做一个字符设备接收用户输入,根据输入,投递 input 事件。
还有一种方式就是直接 往 evnent 里写入数据, 都可以达到控制鼠标键盘的功能。

本篇文章就是演示直接写入 event 的方法。
linux/input.h中有定义,这个文件还定义了标准按键的编码等

struct input_event {
struct timeval time; //按键时间
__u16 type; //类型,在下面有定义
__u16 code; //要模拟成什么按键
__s32 value;//是按下还是释放
};

code:
事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码, 0x110~0x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux /input.h文件. 如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向 REL_X (代码为0x00),指示鼠标的Y轴方向REL_Y(代码为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).

type:
EV_KEY,键盘
EV_REL,相对坐标
EV_ABS,绝对坐标

value:
事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值.
/*
* Event types
*/

#define EV_SYN 0x00
#define EV_KEY 0x01 //按键
#define EV_REL 0x02 //相对坐标(轨迹球)
#define EV_ABS 0x03 //绝对坐标
#define EV_MSC 0x04 //其他
#define EV_SW 0x05
#define EV_LED 0x11 //LED
#define EV_SND 0x12//声音
#define EV_REP 0x14//repeat
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)

下面是一个模拟鼠标和键盘输入的例子:

#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

void simulate_key(int fd,int kval)
{
struct input_event event;
event.type = EV_KEY;
event.value = 1;
event.code = kval;

gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;

event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));

memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = kval;
event.value = 0;
write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));

}

void simulate_mouse(int fd)
{
struct input_event event;
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_REL;
event.code = REL_X;
event.value = 10;
write(fd, &event, sizeof(event));

event.type = EV_REL;
event.code = REL_Y;
event.value = 10;
write(fd, &event, sizeof(event));

event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
}

int main()
{
int fd_kbd;
int fd_mouse;
fd_kbd = open("/dev/input/event1",O_RDWR);
if(fd_kbd<=0){
printf("error open keyboard:/n");
return -1;

}

fd_mouse = open("/dev/input/event2",O_RDWR);
if(fd_mouse<=0){
printf("error open mouse/n");
return -2;
}

int i = 0;
for(i=0; i< 10; i++)
{
simulate_key(fd_kbd, KEY_A + i);
simulate_mouse(fd_mouse);
sleep(1);
}

close(fd_kbd);
}
模拟了鼠标和键盘的输入事件。
关于这里 open 哪个 event , 可以通过 cat /proc/bus/input/devices
I: Bus=0017 Vendor=0001 Product=0001 Version=0100
N: Name="Macintosh mouse button emulation"
P: Phys=
S: Sysfs=/class/input/input0
U: Uniq=
H: Handlers=mouse0 event0
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=3

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/class/input/input1
U: Uniq=
H: Handlers=kbd event1
B: EV=120013
B: KEY=4 2000000 3803078 f800d001 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7

I: Bus=0019 Vendor=0000 Product=0002 Version=0000
N: Name="Power Button (FF)"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/class/input/input3
U: Uniq=
H: Handlers=kbd event3
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button (CM)"
P: Phys=PNP0C0C/button/input0
S: Sysfs=/class/input/input4
U: Uniq=
H: Handlers=kbd event4
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0003 Vendor=046d Product=c018 Version=0111
N: Name="Logitech USB Optical Mouse"
P: Phys=usb-0000:00:1d.1-2/input0
S: Sysfs=/class/input/input24
U: Uniq=
H: Handlers=mouse1 event2
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103

我的鼠标是 罗技 的 Logitech USB Optical Mouse, 所以 鼠标是 event2
下面是一个读取 鼠标和键盘事件的例子:
#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

static void show_event(struct input_event* event)
{
printf("%d %d %d/n", event->type, event->code, event->value);

return;
}

int main(int argc, char* argv[])
{
struct input_event event = {{0}, 0};
const char* file_name = argc == 2 ? argv[1] : "/dev/input/event2";

int fd = open(file_name, O_RDWR);


if(fd > 0)
{

while(1)
{
int ret = read(fd, &event, sizeof(event));
if(ret == sizeof(event))
{
show_event(&event);
}
else
{
break;
}
}
close(fd);
}

return 0;
}

很多人对于 如何模拟 CTRL + SPACE 感兴趣, 下面也给个例子,呵呵。
void simulate_ctrl_space(int fd)
{
struct input_event event;

//先发送一个 CTRL 按下去的事件。
event.type = EV_KEY;
event.value = 1;
event.code = KEY_LEFTCTRL;
gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;

event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));

//先发送一个 SPACE 按下去的事件。
event.type = EV_KEY;
event.value = 1;
event.code = KEY_SPACE;
gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;

//发送一个 释放 SPACE 的事件
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = KEY_SPACE;
event.value = 0;
write(fd, &event, sizeof(event));

event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));


//发送一个 释放 CTRL 的事件
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = KEY_LEFTCTRL;
event.value = 0;
write(fd, &event, sizeof(event));


event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));

}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pottichu/archive/2009/12/18/5030860.aspx

分享到:
评论

相关推荐

    linux 虚拟键盘驱动

    驱动 可以通过向设备文件里 模拟鼠标 键盘的输入;这个是实际项目中用到的基本版本,如果需要其他的按键可以自己扩展;学习交流

    Qt5虚拟键盘支持拖动中文拼音,大小修改

    Qt虚拟虚拟键盘修改了源码,实现中引文切换,大小修改

    虚拟键盘(软键盘)virtualkeyboard1.2源代码

    前些天花了很多时间写这样一个软键盘,效果是显示一个与键盘外观相似的视图,通过鼠标单击像活动窗口发送虚拟的键盘消息。目标是实现像windows自带的软键盘osk相似。 文档在:...

    vmulti:虚拟多HID驱动程序(多点触摸,鼠标,数字转换器,键盘,操纵杆)

    vmulti:虚拟多HID驱动程序(多点触摸,鼠标,数字转换器,键盘,操纵杆)

    堪称完美的虚拟键盘输入法,支持QT4/QT5,支持跨平台

    4、鼠标可任意拖动输入法。 5、输入法面板样式独立,无边框,不影响其它界面。 6、独立的面板隐藏按钮。 7、完美支持QT4,QT5版本,支持X86,ARM等嵌入式平台。 8、支持Widgets方式开发及调用 9、。。。。

    gostwriter:用于Linux的虚拟键盘,它利用devuinput注入键事件

    这是用于Go的简单虚拟键盘,它使用/ dev / uinput来注入键事件,就好像是从真实键盘上那样。 ##为什么? 以编程方式模拟用户的击键,即可以映射到键盘输入的模拟游戏板或其他设备。 ## Limitations目前仅执行键盘...

    Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

    本文实例讲述了Python PyAutoGUI模块控制鼠标和键盘实现自动化任务。分享给大家供大家参考,具体如下: PyAutoGUI是用Python写的一个模块,使用它可以控制鼠标和键盘。 利用它可以实现自动化任务,再也不用担心有...

    Linux应用技术:二Linux初体验命令操作界面使用.pptx

    不支持鼠标,通过键盘输入指令。 命令行界面也被称为字符命令行用户界面(CUI) 命令行优势 节约系统资源 比图形用户界面(GUI)响应速度快 在使用者是管理维护人员时,更多情况下会使用远程登录管理服务器(易受到...

    Synergy1.14 最新版本 包含Windows版+MacOS版+Linux版+ARM版

    Synergy 允许你轻松地在你办公桌上多台计算机之间共享你的鼠标和键盘。你只要将鼠标(指针)从一台计算机的屏幕边缘移出到另 一个屏幕就行了。甚至可以共享你的剪贴板。你所需要的仅仅是一个网络连接。Synergy 是跨...

    Virtual MIDI Piano Keyboard:适用于Linux,Windows和OSX的虚拟MIDI控制器-开源

    VMPK是用于Linux,Windows和OSX的虚拟MIDI钢琴键盘。 该程序基于Qt和Drumstick,是使用计算机的字母数字键盘和鼠标的MIDI事件生成器。 它也可以用来显示接收到的MIDI音符。

    Synergy 键盘鼠标共享 v1.12.0

    为您提供Synergy 键盘鼠标共享下载,Synergy允许你轻松地在你办公桌上多台计算机之间共享你的鼠标和键盘。你只要将鼠标(指针)从一台计算机的屏幕边缘移出到另 一个屏幕就行了。甚至可以共享你的剪贴板。你所需要的...

    Linux编程从入门到精通

    9.1 鼠标编程 307 9.2 调制解调器编程 308 9.3 打印机编程 308 9.4 游戏杆编程 308 第10章 把应用程序移植到Linux上 309 10.1 介绍 309 10.2 信号处理 309 10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux...

    RED HAT LINUX 6大全

    5.4.5 更改键盘和鼠标设置 75 5.4.6 更改窗口按钮 76 5.4.7 控制光标在桌面上的移动 78 5.5 fvwm2的AnotherLevel配置特性 79 5.5.1 重要的文件 79 5.5.2 配置AnotherLevel 79 5.5.3 键盘控制 80 5.6 AfterStep窗口...

    LINUX编程白皮书 (全集)

    9.1 鼠标编程 307 9.2 调制解调器编程 308 9.3 打印机编程 308 9.4 游戏杆编程 308 第10章 把应用程序移植到Linux上 309 10.1 介绍 309 10.2 信号处理 309 10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux...

    linux编程白皮书

    9.1 鼠标编程 307 9.2 调制解调器编程 308 9.3 打印机编程 308 9.4 游戏杆编程 308 第10章 把应用程序移植到Linux上 309 10.1 介绍 309 10.2 信号处理 309 10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux...

    嵌入式Linux驱动程序设计从入门到精通.part01.rar

    button.c 键盘驱动 CHA4 Linux内核I2C驱动 CHA5 usb-skeleton.c USB驱动框架 camera Spcaview相关代码 CHA6 skeleton FrameBuffer驱动框架 2410fb.c S3C2410X LCD驱动 CHA7 button.c 输入形式的按键驱动 LED.c ...

    Linux从入门到精通

    E.8.13 我有一个微软串口鼠标, Linux不能使用它. 怎么办? E.9 系统管理 E.9.1 当我用usercfg创建用户, 他们不能登录. E.9.2 什么是PAM? 为什么要用它? E.9.3 我如何在我的Linux系统上设置Secure Shell (SSH)? E...

    Synergy键盘鼠标共享-其他

    Synergy允许你轻松地在你办公桌上多台计算机之间共享你的鼠标和键盘。你只要将鼠标(指针)从一台计算机的屏幕边缘移出到另 一个屏幕就行了。甚至可以共享你的剪贴板。你所需要的仅仅是一个网络连接。Synergy是跨...

    《Linux从入门到精通》

    E.8.13 我有一个微软串口鼠标, Linux不能使用它. 怎么办? E.9 系统管理 E.9.1 当我用usercfg创建用户, 他们不能登录. E.9.2 什么是PAM? 为什么要用它? E.9.3 我如何在我的Linux系统上设置Secure Shell (SSH)? E...

    linux从入门到精通.chm

    E.8.13 我有一个微软串口鼠标, Linux不能使用它. 怎么办? E.9 系统管理 E.9.1 当我用usercfg创建用户, 他们不能登录. E.9.2 什么是PAM? 为什么要用它? E.9.3 我如何在我的Linux系统上设置Secure Shell (SSH)? E...

Global site tag (gtag.js) - Google Analytics