① 如何在linux下禁用鍵盤,觸摸板,滑鼠等輸入設備
用 xinput 來禁用/啟用輸入設備。我經常用 synclient 來關掉我的觸摸板, 或者用 xinput 來關閉我的筆記本鍵盤。
第一步我們需要先拿到設備的名字或者ID:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ USB Optical Mouse id=8 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=7 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Power Button id=10 [slave keyboard (3)]
↳ Video Bus id=11 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=6 [slave keyboard (3)]
在這里觸摸板的名字是 'SynPS/2 Synaptics TouchPad' ID是 7;
鍵盤的名字是 'AT Translated Set 2 keyboard' ID是 6.
下一步我們要知道設備都有什麼屬性:
$ xinput list-props 'AT Translated Set 2 keyboard'
Device 'AT Translated Set 2 keyboard':
Device Enabled (127): 1
鍵盤只有一個屬性 'Device Enabled' 他的值是 1,意思就是說鍵盤是打開狀態的。
我們來嘗試關掉它:
sleep 0.1 ; xinput set-prop 'AT Translated Set 2 keyboard' 'Device Enabled' 0 ; sleep 5 ; xinput set-prop 'AT Translated Set 2 keyboard' 'Device Enabled' 1
開頭 sleep 0.1 的目的是要留出時間讓你執行當前命令時所敲的回車的按鍵(keypress)事件能夠完成, 我猜測當你按下回車時命令就會執行並把鍵盤禁用,但是按鍵彈起(keyup)還沒有被發送,所以X會以為你一直按這回車鍵。
另一個更簡單的用法是用ID來進行操作,這樣你就不需要輸入一大長串的名字了:
sleep 0.1 ; xinput set-prop 8 127 0 ; sleep 5 ; xinput set-prop 8 127 1
鍵盤的ID是8, 屬性 'Device Enabled' 的ID是127。 當你用 list-props 列出設備屬性時, 在屬性名後面的數字就是屬性的ID。 像 'Device Enabled' 的ID總是 127,但是設備的ID就不一樣,它跟設備的連接時間有關,一般越先連接的設備ID越小,之後會越來越大。
PS:設置設備屬性不需要root許可權。
② 如何在 Linux 環境下利用 Python 監聽當前系統的滑鼠事件
linux下好辦,所有的設備都當作文件處理了,在『/dev/input』目錄下找到滑鼠對應設備文件讀出來即可。
滑鼠設備文件是『/dev/input/mice』,讀3個位元組,三個位元組的值分別是『Button類型』,『X的相對位移』,『Y的相對位移』。取Button的低3位(Button & 0x07)。 0x01 -> LeftButtonDown, 0x02 -> RightButtonDown.
import struct
mou = open( "/dev/input/mice", "rb" );
def m_event():
m = mou.read(3)
b = ord( m[0] )
bl = b & 0x1
bm = ( b & 0x4 ) > 0
br = ( b & 0x2 ) > 0
x,y = struct.unpack( "bb", m[1:] )
print "Left:%d, Middle: %d, Right: %d, x: %d, y: %d\n" % (bl,bm,br, x, y)
while( 1 ):
m_event()
mou.close();
③ qt linux窗口大小變化後刷新滑鼠事件
滑鼠事件使用的時候,需要加頭文件。
滑鼠移動事件默認情況下,觸發事件需要點擊一下,才能觸發。可設置為自動觸發。一個滑鼠事件包含一些指定的接受標志flag用於指出該事件是否會被接收和處理,如果滑鼠指針所在宴禪的父窗口不接收該事件則可以調用函數ignore()予以忽略。
Qt是一個跨平台的C++圖形用戶界面庫,由挪威TrollTech公司出品,包括Qt、基於FrameBuffer的QtopiaCore、快速開中散發工具QtDesigner和賣祥氏國際化工具QtLinguist等部分。Qt支持所有的UNIX系統,當然也包括Linux系統,還支持WinNT/Win2k、Windows95/98平台。
④ 基於LINUX環境的自動化測試的研究應用
(一)各種技術應用的前提。對於在開源社區和一些開源項目中獲得的測試工具,首先需要了解工具適用於哪些類型應用的測試,以及工具發布後的發布說明和FAQ。開源的工具通常不像商業工具那樣成熟穩定,因此找出工具的適用范圍以及探索工具的實現程度是進行自動化測試應用的前提。
(二)各種技術應用的環境需求。對於各類工具,需要關注編譯和運行時對各種包和庫及其版本的依賴關系以及對預先安裝的應用的依賴關系。這些在用戶手冊中都有詳盡的說明。
(三)伺服器性能監視器。大部分測試工具沒有提供伺服器端的性能監控功能,測試工程師需要根據實際的需求編寫性能監控腳本來配合工具的使用。
下面結合曾經參與進行過的Linux平台下的自動化測試的研究,面向不同類別的測試用例自動化的需求,將主要從功能測試,如GUI測試、命令行客戶端的測試,以及性能測試等幾個方面對Linux平台下的測試工作的自動化進行分析和說明。
GZW自動化洲試
對於GUI測試的自動化,通常的測試工具所使用的捕捉/回放技術有兩種,一種是通過記錄界面的滑鼠事件(如點擊、移動)和鍵盤事件來完成錄制和回放,另外一種則是錄制和回放都是基於控制項的識別和操作進行的掘空,每個腳本的執行都是控制項對象的屬性改變或事件觸發。我們從開源社區可以獲得如上兩種類型的運行於Linux平台之上的典型測試工具,如Knee和LDTP等。
(一)Xnee工具
在Linux操作系統的xll環境下,Xnee能夠錄制、回放和分發用戶的動作。Xnee的捕捉/回放技術是記錄滑鼠事件和鍵盤事件。進入錄制模式時,Xnee記錄發送至和來自X server之間的協議數據拷貝,並生成Xneesession文件。在回放模式下,Xnee讀取Xnee Session中的事件,模仿整個錄制過程(即用戶操作過程)完成和x server之間的通訊,被錄制的應用軟體(Xclient)則接收來自xserver的消息,完成預設的動作。
(二)LDTP測試工具/框架
Linux Desktop Testing Project(LDTP)測試工具/框架能夠基於用戶在應用界面的選擇進行腳本的錄制。LDTPI具使用了Gnome環境下的Accessibility庫即輔助選項庫(at-spi)。使用輔助選項能夠獲得應用通過AT-SPI協議提供的關於用戶界面的信息和界面控制項的當前狀態或者屬性。LDTPI具/框架的體系結構如下:
AT-SPI的基礎思想就是為用戶界面的可視化元素提供對應的輔助對象,而錄制完成的每個腳本的執行都是基於這些輔助對象進行的。對於希望利用LDTPI具進行測試的應用,需要激活輔助選項。
(三)GUI自動化測試工具的應用
在實際的GUI自動化測試中,LDTPI具應用的場景會更廣泛一些。LDTPI具可以識別窗口中的對象(如按鈕),測試腳本使用LDTP的API介面,每個API介面對UI對象進行操作判局瞎存在兩個最基本的入口,即窗口和對象臘早,窗口通過窗口的類型和名稱(即標題)識別,對象通過希望操作的控制項的類型和名稱(標簽或者關聯的標簽)識別。我們同樣可以通過at-pokel具展現激活了輔助選項的應用程序窗口的對象及對象屬性。在測試Linux桌面產品和伺服器產品的過程中,使用LDTPI具可以測試任何啟用輔助選項的Gnome應用,如Mozilla,OpenOffice.org、Evolution郵件客戶端,Nautilus文件瀏覽器等等,此外還可以測試UI界面基於Swing的Java應用,以及KDE4.O上基於QT4.0的應用等等。
而Xneel具所針對的應用程序類型就沒有特別的限制,對於一些簡單的窗口驗證測試和界面的穩定性測試等則比較有效。Xnee相對於基於控制項方式捕獲和回放的工具而言,不用擔心存在控制項不能被識別的問題。
從使用的情況來看,各個工具也都因為實現技術而存在一定的缺陷,如兩個工具均不能插入驗證點,從而不能實現用例級別的結果驗證;LDTP對於界面的個別元素捕獲不到以及不能對不支持輔助選項的應用進行測試等等;而Xneel具生成的腳本可編輯性差,同時由於錄制生成的腳本中的事件和屏幕坐標相關,因此當出現窗口彈出位置發生變化等問題時,就需要考慮回放時應該如何來處理這些變化。
⑤ Linux下如何捕捉滑鼠事件
usbhid和usbmouse.c都在/usr/src/linux/drivers/hid/usbhid目錄下 USB 匯流排引出兩個重要的鏈表! 一個 USB 匯流排引出兩個重要的鏈表,一個為 USB 設備鏈表,一個為 USB 驅動鏈表。設備鏈表包含各種系統中的USB 設備以及這些設備的所有介面,驅動...
⑥ Linux QT 中控制項QTableView相應滑鼠事件
重載QTableView從QAbstractItemView繼承來的靜態函數就大裂卜kyle
按滾穗你的要去i,下源賣面2個都可以
void activated ( const QModelIndex & index )
void clicked ( const QModelIndex & index )
⑦ linux下如何模擬按鍵輸入和模擬滑鼠
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) 1。模擬按鍵輸入 //其中0 表示釋放,1 按鍵按下,2 表示一直按下 //0 for EV_KEY for release, 1 for keypress and 2 for autorepeat. void simulate_key(int fd,int value) { struct input_event event; event.type = EV_KEY; //event.code = KEY_0;//要模擬成什麼按鍵 event.value = value;//是按下還是釋放按鍵或者重復 gettimeofday(&event.time,0); if(write(fd,&event,sizeof(event)) < 0){ dprintk("simulate key error~~~\n"); return ; } } 2。模擬滑鼠輸入(軌跡球) void simulate_mouse(int fd,char buf[4]) { int rel_x,rel_y; static struct input_event event,ev; //buf[0],buf[2],小於0 則為左移,大於0 則為右移 //buf[1],buf[3],小於0 則為下移,大於0 則為上移 dprintk("MOUSE TOUCH: x1=%d,y1=%d,x2=%d,y2=%d\n",buf[0],buf[1],buf[2],buf[3]); rel_x = (buf[0] + buf[2]) /2; rel_y = -(buf[1] + buf[3]) /2; //和我們的滑鼠是相反的方向,所以取反 event.type = EV_REL; event.code = REL_X; event.value = rel_x; gettimeofday(&event.time,0); if( write(fd,&event,sizeof(event))!=sizeof(event)) dprintk("rel_x error~~~:%s\n",strerror(errno)); event.code = REL_Y; event.value = rel_y; gettimeofday(&event.time,0); if( write(fd,&event,sizeof(event))!=sizeof(event)) dprintk("rel_y error~~~:%s\n",strerror(errno)); //一定要刷新空的 write(fd,&ev,sizeof(ev)); } 滑鼠和鍵盤文件打開方法: int fd_kbd; // /dev/input/event1 int fd_mouse; //dev/input/mouse2 fd_kbd = open("/dev/input/event1",O_RDWR); if(fd_kbdkey.window = window->window; //一定要設置為主窗口 event->key.keyval = keyval; //FIXME:一定要加上這個,要不然容易出錯 g_object_ref(event->key.window); gdk_threads_enter(); //FIXME: 記得用這個來發送事件 gtk_main_do_event(event); gdk_threads_leave(); gdk_event_free(event); } kernel 里input 模塊 input_dev 結構: struct input_dev { void *private; const char *name; const char *phys; const char *uniq; struct input_id id; /* * 根據各種輸入信號的類型來建立類型為unsigned long 的數組, * 數組的每1bit 代表一種信號類型, * 內核中會對其進行置位或清位操作來表示時間的發生和被處理. */ unsigned long evbit[NBITS(EV_MAX)]; unsigned long keybit[NBITS(KEY_MAX)]; unsigned long relbit[NBITS(REL_MAX)]; unsigned long absbit[NBITS(ABS_MAX)]; unsigned long mscbit[NBITS(MSC_MAX)]; unsigned long ledbit[NBITS(LED_MAX)]; unsigned long sndbit[NBITS(SND_MAX)]; unsigned long ffbit[NBITS(FF_MAX)]; unsigned long swbit[NBITS(SW_MAX)]; ......................................... }; /** * input_set_capability - mark device as capable of a certain event * @dev: device that is capable of emitting or accepting event * @type: type of the event (EV_KEY, EV_REL, etc...) * @code: event code * * In addition to setting up corresponding bit in appropriate capability * bitmap the function also adjusts dev->evbit. */ /* 記錄本設備對於哪些事件感興趣(對其進行處理)*/ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code) { switch (type) { case EV_KEY: __set_bit(code, dev->keybit);//比如按鍵,應該對哪些鍵值的按鍵進行處理(對於其它按鍵不予理睬) break; case EV_REL: __set_bit(code, dev->relbit); break; case EV_ABS: __set_bit(code, dev->absbit); break; case EV_MSC: __set_bit(code, dev->mscbit); break; case EV_SW: __set_bit(code, dev->swbit); break; case EV_LED: __set_bit(code, dev->ledbit); break; case EV_SND: __set_bit(code, dev->sndbit); break; case EV_FF: __set_bit(code, dev->ffbit); break; default: printk(KERN_ERR "input_set_capability: unknown type %u (code %u)\n", type, code); mp_stack(); return; } __set_bit(type, dev->evbit);//感覺和前面重復了(前面一經配置過一次了) } EXPORT_SYMBOL(input_set_capability); static irqreturn_t gpio_keys_isr(int irq, void *dev_id) { int i; struct platform_device *pdev = dev_id; struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; struct input_dev *input = platform_get_drvdata(pdev); for (i = 0; i < pdata->nbuttons; i++) { struct gpio_keys_button *button = &pdata->buttons[i]; int gpio = button->gpio; if (irq == gpio_to_irq(gpio)) {//判斷哪個鍵被按了? unsigned int type = button->type ?: EV_KEY; int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;//記錄按鍵狀態 input_event(input, type, button->code, !!state);//匯報輸入事件 input_sync(input);//等待輸入事件處理完成 } } return IRQ_HANDLED; } /* * input_event() - report new input event * @dev: device that generated the event * @type: type of the event * @code: event code * @value: value of the event * * This function should be used by drivers implementing various input devices * See also input_inject_event() */ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { struct input_handle *handle; if (type > EV_MAX || !test_bit(type, dev->evbit))//首先判斷該事件類型是否有效且為該設備所接受 return; add_input_randomness(type, code, value); switch (type) { case EV_SYN: switch (code) { case SYN_CONFIG: if (dev->event) dev->event(dev, type, code, value); break; case SYN_REPORT: if (dev->sync) return; dev->sync = 1; break; } break; case EV_KEY: /* * 這里需要滿足幾個條件: * 1: 鍵值有效(不超出定義的鍵值的有效范圍) * 2: 鍵值為設備所能接受(屬於該設備所擁有的鍵值范圍) * 3: 按鍵狀態改變了 */ if (code > KEY_MAX || !test_bit(code, dev->keybit) || !!test_bit(code, dev->key) == value) return; if (value == 2) break; change_bit(code, dev->key);//改變對應按鍵的狀態 /* 如果你希望按鍵未釋放的時候不斷匯報按鍵事件的話需要以下這個(在簡單的gpio_keys 驅動中不需要這個,暫時不去分析) */ if (test_bit(EV_REP, dev->evbit) && dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] && dev->timer.data && value) { dev->repeat_key = code; mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->rep[REP_DELAY])); } break; ........................................................ if (type != EV_SYN) dev->sync = 0; if (dev->grab) dev->grab->handler->event(dev->grab, type, code, value); else /* * 循環調用所有處理該設備的handle(event,mouse,ts,joy 等), * 如果有進程打開了這些handle(進行讀寫),則調用其對應的event 介面向氣匯報該輸入事件. */ list_for_each_entry(handle, &dev->h_list, d_node) if (handle->open) handle->handler->event(handle, type, code, value); } EXPORT_SYMBOL(input_event); event 層對於input 層報告的這個鍵盤輸入事件的處理: drivers/input/evdev.c: static struct input_handler evdev_handler = { .event = evdev_event, .connect = evdev_connect, .disconnect = evdev_disconnect, .fops = &evdev_fops, .minor = EVDEV_MINOR_BASE, .name = "evdev", .id_table = evdev_ids, }; 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 #include #include #include #include #include #include #include #include #include #include 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
⑧ linux下怎麼用C++來監聽和模擬滑鼠事件
joytokey也能模擬滑鼠的
你點開一個鍵設置的時候,歷備裡面除了鍵盤的選項還有滑鼠的選碼返項,然後按照裡面提示遲爛飢來設置就ok啦
⑨ linux將滑鼠識別為觸摸屏模式
檢查觸摸屏是否正常接入
打開終端,輸入以下指令激陸鎮
$ cat /proc/bus/input/devices
電腦上所有的輸入設備都會被列出。由於筆記本開機之後,觸摸屏是最後明粗被接入的,所以從下往上找,很快就能找到某個N: Name="",Name的內容里帶有Touch字樣的項目。這就表示系統已經悉擾識別到了這塊觸摸屏,並開始接收它的事件了。
⑩ linux input event 子系統
一、linux input 子系統中,每個輸入設備可以建立一個devices,如插入USB mouse的時候會建立,在系統、dev/input目錄下就會生成一個對應的device,如:/dev/input/event0,可以通過讀取device獲取輸入設備的信息; 具體可以訪問 http://blog.sina.com.cn/s/blog_602f87700101dno6.html
0.1:關鍵結構體input_event信息:
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
type: 設備類型。可以設置為:
sdk封裝的解決思路;
type: EV_REL滑鼠設備 0x02
code : rel_x 0x00 表示x軸方向 rel_y 0x01 表示y軸方埋正鋒向 (一次滑鼠移動會產生兩個input event事件)
value: EV_REL type下有正清胡負表示方向
介紹鍵盤的code
Type為EV_KEY時,value: 0表示按鍵抬起。1表彎晌示按鍵按下。(4表示持續按下等?)。
問題:因為會出現一次滑鼠移動就有兩個事件產生,所以就要判斷這一時刻到底是哪個事件
方法:
滑鼠事件:
上1
下0
左2
右3
鍵盤事件:
上103
下108
左105
右106
停28
藍牙鍵盤
1:2
2:3
3:4
4:5
5:6
w:17
a:30
s:31
d:32