linux下滑鼠和鍵盤的模擬控制,也就是為手勢和語音控制滑鼠和鍵盤部分服務的。
有關於本系統構建的文章結構都會由三個部分來組織,一是該功能模組的介紹和在linux下簡單應用程式的實現;二是將該功能模組整合到互動系統(先以tld為地基)中去;三是分析目前存在的問題與未來的解決構思。
一、input子系統和模擬程式編寫:
linux 輸入子系統是linux核心用於管理各種輸入裝置(鍵盤,滑鼠,遙控杆,書寫板等等)的。輸入子系統分為三塊:input core,drivers和event handlers。正常的路徑是從底層硬體到驅動,從驅動到input core,從input core到event handler,從event handler到user space。
這麼說吧:如果是沒有這個input子系統的話,假如我們用鍵盤按下了乙個鍵a,鍵盤會有乙個linux的裝置驅動檔案,假設是/dev/keyboard,我們的使用者空間的應用程式就會開啟並訪問這個裝置檔案/dev/keyboard,應用程式會輪詢這個檔案,一旦你按下了乙個鍵a了,它就會返回給使用者程式說你按下了鍵a。那麼如果有了input子系統的話,我們的使用者空間的應用程式就不是直接開啟和訪問鍵盤的裝置驅動檔案了,而是訪問由鍵盤驅動在input子系統中註冊的event事件檔案,例如/dev/input/event3,而對於鍵盤驅動來說,它也是實現由input子系統提供的介面就可以了。按下鍵了,就傳送給input子系統。不再直接與使用者空間的應用程式直接面對面了。這樣,就很方便的對驅動和應用程式都統一了介面,而且同一種介面還適合管理多種硬體。好像很簡單的問題給我囉嗦化了,不知道有沒有說錯,呵呵。
這個input子系統可以很容易地讓我們在使用者空間模擬滑鼠和鍵盤事件。例如,你可以寫乙個應用程式,往input子系統的/dev/input/event3裝置檔案(假設這個是鍵盤裝置檔案)寫入a,這樣就相當於你通過鍵盤按下了a,而這個a對系統任意的乙個當前活動視窗有效(捕捉)。
要實現這個功能,我們需要回答一下幾個問題:
1、往什麼裝置檔案寫?
也就是如何檢視哪些裝置檔案是鍵盤的,哪些是滑鼠的,找到這些裝置檔案,我們才可以通過應用程式來開啟和寫入鍵值(或者滑鼠的控制資訊)。
通過#cat /proc/bus/input/devices可以檢視到當前input子系統下面的所有event裝置,我們找到滑鼠和鍵盤的即可。
例如:
i: bus=0003 vendor=046d product=c018 version=0111
n: name=" 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
上面name處可以看到這個滑鼠裝置,然後對應的控制代碼handlers是event2;
2、怎麼寫入:
大家都知道,linux下萬物皆檔案,所以對於檔案操作我們只需要:open()和write()就可以了。
3、要寫入什麼東西(鍵值的編碼):
在/usr/include/linux/input.h中有定義,這個檔案定義了event事件的結構體,api和標準按鍵的編碼等;我們需要將要寫入的按鍵編碼填充到結構體中,然後寫入鍵盤或者滑鼠的事件裝置驅動檔案中。
輸入事件的結構體:
struct input_event ;
標準按鍵的編碼:(只列舉部分)
type:
事件的型別:
ev_key, 按鍵事件,如鍵盤的按鍵(按下哪個鍵),滑鼠的左鍵右鍵(是非擊下)等;
ev_rel, 相對座標,主要是指滑鼠的移動事件(相對位移);
ev_abs, 絕對座標,主要指觸控螢幕的移動事件,但好像這個不能用在滑鼠上面,也就是說無法通過這個來獲取滑鼠的絕對座標(滑鼠是乙個相對位移的裝置)。
code:
事件的**:
如果事件的型別**是ev_key,該**code為裝置鍵盤**。**植0~127為鍵盤上的按鍵**,0x110~0x116為滑鼠上按鍵**,其中0x110(btn_ left)為滑鼠左鍵,0x111(btn_right)為滑鼠右鍵,0x112(btn_ middle)為滑鼠中鍵。其它**含義請參看include/linux /input.**件。該檔案中會定義相應的巨集來代表不同的按鍵。
如果事件的型別**是ev_rel,code值表示軌跡的型別。如指示滑鼠的x軸方向rel_x(**為0x00),指示滑鼠的y軸方向rel_y,指示滑鼠中輪子方向rel_wheel。
value:
事件的值:
如果事件的型別**是ev_key,當按鍵按下時值為1,鬆開時值為0;
如果事件的型別**是ev_ rel,value的正數值和負數值分別代表兩個不同方向的值。例如:如果code是rel_x,value是10的話,就表示滑鼠相對於上一次的座標,往x軸向右移動10個畫素點。
在linux下寫的簡單的模擬滑鼠和鍵盤事件的程式:
#include
#include
#include
#include
#include
//按鍵模擬,按鍵包含按下和鬆開兩個環節
void simulate_key(int fd, int kval)
//滑鼠移動模擬
void simulate_mouse(int fd, int rel_x, int rel_y)
int main(int argc, char **ar**)
fd_mouse = open("/dev/input/event2", o_rdwr);
if(fd_mouse <= 0)
for (i = 0; i < 50; i++)
close(fd_kbd);
close(fd_mouse); }
那麼如何模擬組合鍵呢?其實和大家平時按鍵盤的過程是一樣的,我們用程式按照這個過程來模擬就可以了。以ctrl + space為例:
//先傳送乙個ctrl按下去的事件
//再傳送乙個space按下去的事件
//然後傳送乙個釋放space的事件
//再傳送乙個釋放ctrl的事件
得注意每步的傳送都需要同步一次。
Qt 鍵盤 滑鼠事件的處理
事件是對各種應用程式需要知道的由應用程式內部或者外部產生的事情或者動作的通稱。對於初學者,總會對qt中訊號和事件的概念混淆不清。其實,記住事件比訊號更底層就可以了。比如說,我們用滑鼠按下介面上的乙個按鈕,它會發射clicked 單擊訊號,但是,它怎麼知道自己被按下的呢,那就是通過滑鼠事件處理的。這裡...
pygame 鍵盤和滑鼠事件的處理
所謂事件,就是程式上發生的事。例如使用者按下鍵盤上的某個鍵或者單擊 移動滑鼠,對於這些事件,遊戲程式需要作出反應。如 pygame 影象 圖形繪製 中例子,程式會一直執行下去,直到使用者關閉視窗而產生乙個 quit 事件,pygame 會接收使用者的各種操作 例如按鍵盤上的鍵 移動滑鼠等 產生事件。...
JS Dom 鍵盤滑鼠事件
常用滑鼠事件 onclick,ommouseover,onfocus,onmouseout,onblur,onmousemove,onmouseup,onmousedown 滑鼠事件物件 event mouseevent和keyboardevent e.clientx,e.clienty 滑鼠相對於...