arm shell 获取本地键盘输入值_linux下获取按键响应事件【转】
1、問(wèn)題
通過(guò)一個(gè)死循環(huán)將讀取鍵盤(pán)對(duì)應(yīng)的設(shè)備文件將觸發(fā)鍵盤(pán)事件在屏幕上打印出來(lái),按esc退出程序
代碼是在unbuntu10.04編譯執(zhí)行通過(guò)的
2、input_event描述
在Linux內(nèi)核中,input設(shè)備用input_dev結(jié)構(gòu)體描述,使用input子系統(tǒng)實(shí)現(xiàn)輸入設(shè)備驅(qū)動(dòng)的時(shí)候,驅(qū)動(dòng)的核心工作就是向系統(tǒng)報(bào)告按鍵、觸摸屏、鍵盤(pán)、鼠標(biāo)等輸入事件(event,通過(guò)input_event結(jié)構(gòu)體描述),不再需要關(guān)心文件操作接口,因?yàn)镮nput子系統(tǒng)已經(jīng)完成了文件操作接口
linux/input.h 這個(gè)文件定義了event事件的結(jié)構(gòu)體,API和標(biāo)準(zhǔn)按鍵的編碼等;
struct input_event {
struct timeval time;? //按鍵時(shí)間
__u16 type; //事件類型
__u16 code; //要模擬成什么按鍵
__s32 value;//是按下還是釋放
};
type,指事件類型,常見(jiàn)的事件類型有:
EV_KEY, 按鍵事件,如鍵盤(pán)的按鍵(按下哪個(gè)鍵),鼠標(biāo)的左鍵右鍵(是非擊下)等;
EV_REL, 相對(duì)坐標(biāo),主要是指鼠標(biāo)的移動(dòng)事件(相對(duì)位移);
EV_ABS, 絕對(duì)坐標(biāo),主要指觸摸屏的移動(dòng)事件
code:事件的代碼.
如果事件的類型代碼是EV_KEY,該代碼code為設(shè)備鍵盤(pán)代碼.0~127為鍵盤(pán)上的按鍵代碼
關(guān)于按鍵代碼的定義,部分如下所示:
#define KEY_RESERVED? 0
#define KEY_ESC? 1
#define KEY_1? 2
#define KEY_2? 3
#define KEY_3? 4
#define KEY_4? 5
#define KEY_5? 6
#define KEY_6? 7
#define KEY_7? 8
#define KEY_8? 9
#define KEY_9? 10
#define KEY_0? 11
#define KEY_MINUS? 12
#define KEY_EQUAL? 13
#define KEY_BACKSPACE? 14
#define KEY_TAB? 15
#define KEY_Q? 16
#define KEY_W? 17
#define KEY_E? 18
#define KEY_R? 19
#define KEY_T? 20
value:
事件的值.如果事件的類型代碼是EV_KEY,當(dāng)按鍵按下時(shí)值為1,松開(kāi)時(shí)值為0;如果事件的類型代碼是EV_REL,value的正數(shù)值和負(fù)數(shù)值分別代表兩個(gè)不同方向的值.
3、相關(guān)代碼
key_simulator.c
#include
#include
#include
#include
#include
int main ()
{
int keys_fd;
char ret[2];
struct input_event t;
keys_fd = open ("/dev/input/event2", O_RDONLY);
if (keys_fd <= 0)
{
printf ("open /dev/input/event2 device error!\n");
return 0;
}
while (1)
{
if (read (keys_fd, &t, sizeof (t)) == sizeof (t))
{
if (t.type == EV_KEY)
if (t.value == 0 || t.value == 1)
{
printf ("key %d %s\n", t.code,
(t.value) ? "Pressed" : "Released");
if(t.code==KEY_ESC)
break;
}
}
}
close (keys_fd);
return 0;
}
4、注意問(wèn)題
1)不同的類型計(jì)算機(jī),設(shè)備對(duì)應(yīng)event信息會(huì)有所不同
可以用cat獲得的設(shè)備對(duì)應(yīng)event信息:
# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
U: Uniq=
H: Handlers=kbd event0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0017 Vendor=0001 Product=0001 Version=0100
N: Name="Macintosh mouse button emulation"
P: Phys=
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=mouse0 event1
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=/devices/platform/i8042/serio0/input/input2
U: Uniq=
H: Handlers=kbd event2
B: EV=120013
B: KEY=4 2000000 3803078 f800d001 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name="ImPS/2 Generic Wheel Mouse"
P: Phys=isa0060/serio1/input0
S: Sysfs=/devices/platform/i8042/serio1/input/input3
U: Uniq=
H: Handlers=mouse1 event3
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
I line:這行包含身份信息,顯示了 bus type是 3 (usb), vendor, product, version等信息。
N line:這行包含了名字信息。
P line:這行包含了物理設(shè)備信息。
H line: 這行包含了與設(shè)備關(guān)聯(lián)的 handler drivers。
B line: 這些行包含了顯示設(shè)備能力的一些位域 (bitfield)。
我的鍵盤(pán)對(duì)應(yīng)的事件類型是event2
2)open /dev/input/event2 device error
需要使用sudo或者改變?cè)O(shè)備的屬性
如下:
sudo ./key_simulator
或者
chmod 777 /dev/input/event2
本文歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者與出處
作者:流星
Linux 下獲取LAN中指定IP的網(wǎng)卡的MAC(物理地址)
// all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include #include < ...
Linux下獲取硬盤(pán)使用情況
Linux下獲取硬盤(pán)使用情況[總結(jié)] 1.前言 在嵌入式設(shè)備中,硬盤(pán)空間非常有限,在涉及到經(jīng)常寫(xiě)日志的進(jìn)程時(shí)候,需要考慮日志的大小和刪除,不然很快就硬盤(pán)寫(xiě)滿,導(dǎo)致日志程序崩潰.為了捕獲硬盤(pán)寫(xiě)滿的異常場(chǎng) ...
.net core在Linux下獲取AD域信息
.net core在Linux下獲取AD域信息 .net Core 2.1.4 .net core現(xiàn)在System.DirectoryServices只支持Windows平臺(tái)下使用. 參考: http ...
Linux下獲取和設(shè)置IP
在Linux下獲取關(guān)于IP和網(wǎng)關(guān)的操作:重點(diǎn)是對(duì)struct ifreq 的操作. 那么進(jìn)入目錄/usr/include/net/if.h下看查找struct ifreq結(jié)構(gòu)體. /* Interfa ...
window/linux下獲取文件MD5
MD5消息摘要算法(英語(yǔ): MD5 Message-Digest Algorithm), 主要用于確保信息傳輸過(guò)程的一致性校驗(yàn). ? 首先介紹兩個(gè)工具: window: WinMD5Free Linu ...
Linux下獲取本機(jī)IP地址的代碼
Linux下獲取本機(jī)IP地址的代碼,返回值即為互聯(lián)網(wǎng)標(biāo)準(zhǔn)點(diǎn)分格式的字符串. #define ETH_NAME "eth0" //獲得本機(jī)IP地址 char* GetLocalAdd ...
linux下獲取占用CPU資源最多的10個(gè)進(jìn)程
linux下獲取占用CPU資源最多的10個(gè)進(jìn)程,可以使用如下命令組合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下獲取占用 ...
Linux下獲取arm的交叉編譯工具鏈
轉(zhuǎn)載請(qǐng)注明文章:Linux下獲取arm的交叉編譯工具鏈?出處:多客博圖 這里介紹,Linux下獲取arm的交叉編譯工具鏈,比如arm-linux-gnueabihf-gcc.arm-linux-gne ...
在Windows及Linux下獲取毫秒級(jí)運(yùn)行時(shí)間的方法
在Windows下獲取毫秒級(jí)運(yùn)行時(shí)間的方法 頭文件: 函數(shù)原型: /*獲取時(shí)鐘頻率,保存在結(jié)構(gòu)LARGE_INTEGER中***/ WINBASEAPI BOOL W ...
隨機(jī)推薦
MySql: 忘記root密碼
win7 + mysql?5.6.35 C:\Windows\system32>mysql --versionmysql Ver 14.14 Distrib 5.6.35, for Win64 ...
讀javascript高級(jí)程序設(shè)計(jì)15-Ajax,CORS,JSONP,Img Ping
平時(shí)用慣了jQuery.ajax之類的方法,卻時(shí)常忽略了它背后的實(shí)現(xiàn),本文是學(xué)習(xí)了AJAX基礎(chǔ)及幾種跨域解決方案之后的一些收獲. 一.AJAX——XMLHttpRequest 談起Ajax我們都很熟悉 ...
200 OK (from cache) 與 304 Not Modified
解釋: 200 OK (from cache)? 是瀏覽器沒(méi)有跟服務(wù)器確認(rèn),直接用了瀏覽器緩存: 304 Not Modified 是瀏覽器和服務(wù)器多確認(rèn)了一次緩存有效性,再用的緩存. 觸發(fā)區(qū)別: 2 ...
ASP.NET MVC 學(xué)習(xí)2、從Controller傳遞數(shù)據(jù)到View
參考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view 一,Control ...
BZOJ 1048 [HAOI2007]分割矩陣
1048: [HAOI2007]分割矩陣 Time Limit:?10 Sec??Memory Limit:?162 MBSubmit:?623??Solved:?449[Submit][Status ...
ccf練習(xí)---節(jié)日
問(wèn)題描述 有一類節(jié)日的日期并不是固定的,而是以“a月的第b個(gè)星期c”的形式定下來(lái)的,比如說(shuō)母親節(jié)就定為每年的五月的第二個(gè)星期日. 現(xiàn)在,給你a,b,c和y1, y2(1850 ≤ y1, y2?≤ 2 ...
JavaMail收發(fā)郵件的一般流程與主要方法
1.Properties屬性類 Properties p = new Properties(); p.put(key, value); key -|?mail.smtp.host -|?mail.sm ...
iOS 獲取高速隨機(jī)路徑sandbox目錄
NSLog(@"%@", NSHomeDirectory());//沙盒主目錄 NSLog(@"%@", NSTemporaryDirectory());//砂 ...
用C語(yǔ)言實(shí)現(xiàn)Ping程序功能
本文轉(zhuǎn)載自:http://www.ibm.com/developerworks/cn/linux/network/ping/ ping命令是用來(lái)查看網(wǎng)絡(luò)上另一個(gè)主機(jī)系統(tǒng)的網(wǎng)絡(luò)連接是否正常的一個(gè)工具.p ...
php優(yōu)秀框架codeigniter學(xué)習(xí)系列——CI_Lang類學(xué)習(xí)
這篇文章主要介紹CI核心框架工具類CI_Lang. 根據(jù)CI文檔自己的定義,該類用來(lái): 提供相關(guān)的函數(shù),用于檢索語(yǔ)言文件和文本行,以便國(guó)際化. 以下選取類中的重點(diǎn)方法進(jìn)行說(shuō)明. __construct ...
總結(jié)
以上是默认站点為你收集整理的arm shell 获取本地键盘输入值_linux下获取按键响应事件【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 现在的编译器还需要手动展开循环吗_性能
- 下一篇: 清华 词向量库_word2vec 构建中