Linux 虛擬滑鼠,鍵盤

2021-06-18 07:05:02 字數 4000 閱讀 1218

linux 有自己的 input 子系統,可以統一管理滑鼠和鍵盤事件。

基於輸入子系統 實現的 uinput 可以方便的在使用者空間模擬滑鼠和鍵盤事件。

當然,也可以自己造輪子, 做乙個字元裝置接收使用者輸入,根據輸入,投遞 input 事件。

還有一種方式就是直接 往 evnent 裡寫入資料, 都可以達到控制滑鼠鍵盤的功能。

本篇文章就是演示直接寫入 event 的方法。

linux/input.h中有定義,這個檔案還定義了標準按鍵的編碼等

struct input_event ;

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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

void simulate_key(int fd,int kval)

void simulate_mouse(int fd)

int main()

fd_mouse = open("/dev/input/event2",o_rdwr); 

if(fd_mouse<=0)

int i = 0;

for(i=0; i< 10; i++)

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

#include

#include

#include

#include

#include

#include

#include

static void show_event(struct input_event* event)

int main(int argc, char* argv)

, 0};

const char* file_name = argc == 2 ? argv[1] : "/dev/input/event2";

int fd = open(file_name, o_rdwr);

if(fd > 0)

else

} close(fd); }

return 0; }

很多人對於 如何模擬 ctrl + space 感興趣, 下面也給個例子,呵呵。

void simulate_ctrl_space(int fd)

通用滑鼠鍵盤

該程式通過並行機制處理滑鼠和鍵盤的訊息,為了簡化程式裁減了一些 該程式可用為基礎在該程式上新增 可用於文字編輯,遊戲和其他滑鼠鍵盤通用的程式.include include include include include union regs regs unsigned size void far ...

滑鼠鍵盤學習

出現問題地方 1 label 和pushbutton上面無法顯示中文,出現亂碼 待解決 在main.cpp中已加入qtext odec setcodecfortr qtextcodec codecforlocale 2 在鍵入兩個函式 void mousemoveevent qmouseevent ...

linux和windows共享滑鼠鍵盤

先說下原因,因為無線滑鼠突然沒電了,需要在兩台pc間共享滑鼠。好吧查詢下方案,最後選擇synergy。synergy在windows和linux下使用全攻略 多台pc共享一套鍵盤滑鼠 多電腦之間的鍵盤滑鼠共享 網上提供的其他滑鼠鍵盤共享方案還有兩個 sharemouse mousewithoutbo...