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...