日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
輕松實現(xiàn):Linux系統(tǒng)下讀取按鍵的方法(linux讀取按鍵)

在Linux系統(tǒng)下,讀取按鍵是一項用處廣泛的任務(wù)。無論是開發(fā)嵌入式設(shè)備還是PC應(yīng)用程序,都需要讀取用戶輸入的按鍵事件。本文將介紹如何在Linux系統(tǒng)下輕松實現(xiàn)按鍵的讀取。

晉城網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站從2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站

1. 系統(tǒng)調(diào)用

Linux系統(tǒng)提供了一些標(biāo)準(zhǔn)的系統(tǒng)調(diào)用用于讀取按鍵事件。其中最常用的是select() 和 poll()。這兩個系統(tǒng)調(diào)用都是基于文件描述符(file descriptor)的I/O多路復(fù)用技術(shù)實現(xiàn)的。

select()和poll()函數(shù)均是阻塞函數(shù),需要等待文件描述符狀態(tài)發(fā)生變化后才會返回。在讀取按鍵時,我們需要將按鍵設(shè)備的文件描述符加入到select()或poll()函數(shù)的監(jiān)視列表中,當(dāng)有按鍵輸入事件時,就可以通過函數(shù)調(diào)用讀取按鍵的狀態(tài)。

2. 基于事件驅(qū)動的庫

在Linux系統(tǒng)中,evdev是一個基于事件驅(qū)動的輸入設(shè)備抽象層。evdev庫提供了一個標(biāo)準(zhǔn)的接口,可以用于讀取并處理各種輸入事件,比如按鍵事件、觸摸屏事件等。evdev庫有良好的封裝性和跨平臺性,可以在不同類型的Linux系統(tǒng)上使用。

使用evdev庫可以輕松實現(xiàn)按鍵的讀取。首先需要打開輸入設(shè)備,并獲取設(shè)備的事件碼(event code)信息。然后,通過一個循環(huán)來不斷的讀取事件,當(dāng)發(fā)現(xiàn)有按鍵按下或釋放時,就可以通過事件碼來識別按鍵,然后讀取到該按鍵的狀態(tài)信息。

3. Qt框架

Qt是一個跨平臺的GUI應(yīng)用程序開發(fā)框架。除了提供豐富的GUI組件和工具,Qt也提供了許多非常實用的系統(tǒng)功能接口,其中包括讀取按鍵的接口。

在Qt中,可以使用QInputEvent類來讀取按鍵事件。該類提供了一些方法,可以獲取按鍵的狀態(tài)信息,比如按鍵是否被按下、是否被釋放等。在Qt中,可以將一個QWidget對象注冊為一個事件接收者,當(dāng)用戶按下或釋放按鍵時,就可以通過該對象來讀取按鍵的狀態(tài),并做出相應(yīng)的動作。

在Linux系統(tǒng)下,有多種方法可以實現(xiàn)按鍵的讀取。選擇合適的方法取決于具體的需求和項目要求。使用系統(tǒng)調(diào)用可以利用Linux原生的IO多路復(fù)用技術(shù),實現(xiàn)高效的按鍵讀取。使用evdev庫可以提供比較友好的接口,適用于需要讀取多種輸入設(shè)備事件的項目。而使用Qt框架可以提高GUI應(yīng)用程序的交互性,使得用戶能夠更方便地對應(yīng)用程序進行控制。

無論采用哪種方法,都需要遵循一些通用的程序設(shè)計基本原則,比如代碼的可讀性、可維護性和可擴展性等。在程序設(shè)計時,需要合理地使用封裝、繼承和多態(tài)等程序設(shè)計的方法,以實現(xiàn)更為復(fù)雜的功能需求。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220

linux下如何模擬按鍵輸入和模擬鼠標(biāo)

linux/input.h 中有定義,這個文件還定義了標(biāo)準(zhǔn)按鍵的編猜孝銀碼等 struct input_event { struct timeval time; //按鍵時間 __u16 type; //類型,在下面有定義穗宴 __u16 code; //要模擬成什么按鍵 __s32 value;//是按下還是釋放 }; code: 事件的代碼.如果事件的類型代碼是EV_KEY,該代碼code 為設(shè)備鍵盤代碼.代碼植0~127 為鍵盤上的按鍵代碼,0x110~0x116 為鼠標(biāo)上按鍵代碼,其中0x110(N_ LEFT)為鼠標(biāo)左鍵,0x111(N_RIGHT)為鼠標(biāo)右鍵,0x112(N_ MIDDLE)為鼠標(biāo)中鍵.其它代碼含義請參看 include/linux/input.h 文件. 如果事件的類型代碼是EV_REL,code 值表示軌跡的類型.如指示鼠標(biāo)的X軸方向REL_X(代碼為0x00),指示鼠標(biāo)的Y 軸方向REL_Y(代碼為0x01),指示鼠標(biāo)中輪子方向 REL_WHEEL(代碼為0x08). type: EV_KEY,鍵盤 EV_REL,相對坐標(biāo) EV_ABS,絕對坐標(biāo) value: 事件的值.如果事件的類型代碼是EV_KEY,當(dāng)按鍵按下時值為1,松開時值為0;如果事件的類型代碼是 EV_ REL,value 的正數(shù)值和負(fù)數(shù)值分別代表兩個不同方向的值. /* * Event types */ #define EV_SYN 0x00 #define EV_KEY 0x01 //按鍵 #define EV_REL 0x02 //相對坐標(biāo)(軌跡球) #define EV_ABS 0x03 //絕對坐標(biāo) #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;//是按下還是釋放按鍵慎衡或者重復(fù) gettimeofday(&event.time,0); if(write(fd,&event,sizeof(event)) window; //一定要設(shè)置為主窗口 event->key.keyval = keyval; //FIXME:一定要加上這個,要不然容易出錯 g_object_ref(event->key.window); gdk_threads_enter(); //FIXME: 記得用這個來發(fā)送事件 gtk_main_do_event(event); gdk_threads_leave(); gdk_event_free(event); } kernel 里input 模塊 input_dev 結(jié)構(gòu): struct input_dev { void *private; const char *name; const char *phys; const char *uniq; struct input_id id; /* * 根據(jù)各種輸入信號的類型來建立類型為unsigned long 的數(shù)組, * 數(shù)組的每1bit 代表一種信號類型, * 內(nèi)核中會對其進行置位或清位操作來表示時間的發(fā)生和被處理. */ unsigned long evbit; unsigned long keybit; unsigned long relbit; unsigned long abit; unsigned long mscbit; unsigned long ledbit; unsigned long sndbit; unsigned long ffbit; unsigned long swbit; ………………………………….. }; /** * 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. */ /* 記錄本設(shè)備對于哪些事件感興趣(對其進行處理)*/ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code) { switch (type) { case EV_KEY: __set_bit(code, dev->keybit);//比如按鍵,應(yīng)該對哪些鍵值的按鍵進行處理(對于其它按鍵不予理睬) break; case EV_REL: __set_bit(code, dev->relbit); break; case EV_ABS: __set_bit(code, dev->abit); 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); dump_stack(); return; } __set_bit(type, dev->evbit);//感覺和前面重復(fù)了(前面一經(jīng)配置過一次了) } 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 nbuttons; i++) { struct gpio_keys_button *button = &pdata->buttons; 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;//記錄按鍵狀態(tài) 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))//首先判斷該事件類型是否有效且為該設(shè)備所接受 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: 鍵值為設(shè)備所能接受(屬于該設(shè)備所擁有的鍵值范圍) * 3: 按鍵狀態(tài)改變了 */ 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);//改變對應(yīng)按鍵的狀態(tài) /* 如果你希望按鍵未釋放的時候不斷匯報按鍵事件的話需要以下這個(在簡單的gpio_keys 驅(qū)動中不需要這個,暫時不去分析) */ if (test_bit(EV_REP, dev->evbit) && dev->rep && dev->rep && dev->timer.data && value) { dev->repeat_key = code; mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->rep)); } break; ……………………………………………….. if (type != EV_SYN) dev->sync = 0; if (dev->grab) dev->grab->handler->event(dev->grab, type, code, value); else /* * 循環(huán)調(diào)用所有處理該設(shè)備的handle(event,mouse,ts,joy 等), * 如果有進程打開了這些handle(進行讀寫),則調(diào)用其對應(yīng)的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 子系統(tǒng),可以統(tǒng)一管理鼠標(biāo)和鍵盤事件。 基于輸入子系統(tǒng) 實現(xiàn)的 uinput 可以方便的在用戶空間模擬鼠標(biāo)和鍵盤事件。 當(dāng)然,也可以自己造輪子, 做一個字符設(shè)備接收用戶輸入,根據(jù)輸入,投遞 input 事件。 還有一種方式就是直接 往 evnent 里寫入數(shù)據(jù), 都可以達到控制鼠標(biāo)鍵盤的功能。 本篇文章就是演示直接寫入 event 的方法。 linux/input.h 中有定義,這個文件還定義了標(biāo)準(zhǔn)按鍵的編碼等 struct input_event { struct timeval time; //按鍵時間 __u16 type; //類型,在下面有定義 __u16 code; //要模擬成什么按鍵 __s32 value;//是按下還是釋放 }; code: 事件的代碼.如果事件的類型代碼是EV_KEY,該代碼code 為設(shè)備鍵盤代碼.代碼植0~127 為鍵盤上的按鍵代碼, 0x110~0x116 為鼠標(biāo)上按鍵代碼,其中0x110(N_ LEFT)為鼠標(biāo)左鍵,0x111(N_RIGHT)為鼠標(biāo)右鍵,0x112(N_ MIDDLE)為鼠標(biāo)中鍵.其它代碼含義請參看 include/linux /input.h 文件. 如果事件的類型代碼是EV_REL,code 值表示軌跡的類型.如指示鼠標(biāo)的X軸方向 REL_X (代碼為0x00),指示鼠標(biāo)的Y 軸方向REL_Y(代碼為0x01),指示鼠標(biāo)中輪子方向 REL_WHEEL(代碼為0x08). type: EV_KEY,鍵盤 EV_REL,相對坐標(biāo) EV_ABS,絕對坐標(biāo) value: 事件的值.如果事件的類型代碼是EV_KEY,當(dāng)按鍵按下時值為1,松開時值為0;如果事件的類型代碼是 EV_ REL,value 的正數(shù)值和負(fù)數(shù)值分別代表兩個不同方向的值. /* * Event types */ #define EV_SYN 0x00 #define EV_KEY 0x01 //按鍵 #define EV_REL 0x02 //相對坐標(biāo)(軌跡球) #define EV_ABS 0x03 //絕對坐標(biāo) #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) 下面是一個模擬鼠標(biāo)和鍵盤輸入的例子: #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

網(wǎng)頁鏈閉祥接

關(guān)于linux 讀取按鍵的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都創(chuàng)新互聯(lián)科技公司主營:網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、小程序制作、成都軟件開發(fā)、網(wǎng)頁設(shè)計、微信開發(fā)、成都小程序開發(fā)、網(wǎng)站制作、網(wǎng)站開發(fā)等業(yè)務(wù),是專業(yè)的成都做小程序公司、成都網(wǎng)站建設(shè)公司成都做網(wǎng)站的公司。創(chuàng)新互聯(lián)公司集小程序制作創(chuàng)意,網(wǎng)站制作策劃,畫冊、網(wǎng)頁、VI設(shè)計,網(wǎng)站、軟件、微信、小程序開發(fā)于一體。


本文標(biāo)題:輕松實現(xiàn):Linux系統(tǒng)下讀取按鍵的方法(linux讀取按鍵)
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/djcpiij.html