1.查看/dev/input/eventX是什么类型的事件
root@NanoPi2:~# cat /proc/bus/input/devices
I: Bus=0003 Vendor=062a Product=4182 Version=0110
N: Name="MOSART Semi. 2.4G Keyboard Mouse"
P: Phys=usb-nxp-ehci-1.2.2/input0
S: Sysfs=/devices/platform/nxp-ehci/usb1/1-1/1-1.2/1-1.2.2/1-1.2.2:1.0/input/input3
U: Uniq=
H: Handlers=sysrq kbd event3
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
I: Bus=0003 Vendor=062a Product=4182 Version=0110
N: Name="MOSART Semi. 2.4G Keyboard Mouse"
P: Phys=usb-nxp-ehci-1.2.2/input1
S: Sysfs=/devices/platform/nxp-ehci/usb1/1-1/1-1.2/1-1.2.2/1-1.2.2:1.1/input/input4
U: Uniq=
H: Handlers=kbd mouse1 event4
B: PROP=0
B: EV=1f
B: KEY=4837fff 72ff32d bf544446 0 0 1f0001 20f90 8b17c000 677bfa d941dfed 9ed680 4400 0 10000002
B: REL=1c3
B: ABS=1f01 0
B: MSC=10
查询结果是键盘句柄:kbd event3 鼠标句柄:kbd mouse1 event4
设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键,比如KEY_0,KEY-Z等,所以需要用到按键模拟,具体 方法就是操作/dev/input/event1文件,向它写入个input_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)
2.模拟按键输入
//其中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 ;
}
}
3.模拟鼠标输入(轨迹球)
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));
}
4.鼠标和键盘文件打开方法:
int fd_kbd; // /dev/input/event1
int fd_mouse; //dev/input/mouse2
fd_kbd = open("/dev/input/event1",O_RDWR);
if(fd_kbd<=0){
printf("error open keyboard:%s\n",strerror(errno));
return -1;
}
fd_mouse = open("/dev/input/event3",O_RDWR); //如果不行的话,那试试/dev/input/mice
if(fd_mouse<=0){
printf("error open mouse:%s\n",strerror(errno));
return -2;
}
}
5.例子
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
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<=0){
printf("error open keyboard:\n");
return -1;
}
fd_mouse = open("/dev/input/event2",O_RDWR);
if(fd_mouse<=0){
printf("error open mouse\n");
return -2;
}
int i = 0;
for(i=0; i< 10; i++)
{
simulate_key(fd_kbd, KEY_A + i);
simulate_mouse(fd_mouse);
sleep(1);
}
close(fd_kbd);
}
6.模拟多个按键
void simulate_ctrl_space(int fd)
{
struct input_event event;
//先发送一个 CTRL 按下去的事件。
event.type = EV_KEY;
event.value = 1;
event.code = KEY_LEFTCTRL;
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));
//先发送一个 SPACE 按下去的事件。
event.type = EV_KEY;
event.value = 1;
event.code = KEY_SPACE;
gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;
//发送一个 释放 SPACE 的事件
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = KEY_SPACE;
event.value = 0;
write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
//发送一个 释放 CTRL 的事件
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = KEY_LEFTCTRL;
event.value = 0;
write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
}
6.附input.h中key定义
213 #define KEY_RESERVED 0
214 #define KEY_ESC 1
215 #define KEY_1 2
216 #define KEY_2 3
217 #define KEY_3 4
218 #define KEY_4 5
219 #define KEY_5 6
220 #define KEY_6 7
221 #define KEY_7 8
222 #define KEY_8 9
223 #define KEY_9 10
224 #define KEY_0 11
225 #define KEY_MINUS 12
226 #define KEY_EQUAL 13
227 #define KEY_BACKSPACE 14
228 #define KEY_TAB 15
229 #define KEY_Q 16
230 #define KEY_W 17
231 #define KEY_E 18
232 #define KEY_R 19
233 #define KEY_T 20
234 #define KEY_Y 21
235 #define KEY_U 22
236 #define KEY_I 23
237 #define KEY_O 24
238 #define KEY_P 25
239 #define KEY_LEFTBRACE 26
240 #define KEY_RIGHTBRACE 27
241 #define KEY_ENTER 28
242 #define KEY_LEFTCTRL 29
243 #define KEY_A 30
244 #define KEY_S 31
245 #define KEY_D 32
246 #define KEY_F 33
247 #define KEY_G 34
248 #define KEY_H 35
249 #define KEY_J 36
250 #define KEY_K 37
251 #define KEY_L 38
252 #define KEY_SEMICOLON 39
253 #define KEY_APOSTROPHE 40
254 #define KEY_GRAVE 41
255 #define KEY_LEFTSHIFT 42
256 #define KEY_BACKSLASH 43
257 #define KEY_Z 44
258 #define KEY_X 45
259 #define KEY_C 46
260 #define KEY_V 47
261 #define KEY_B 48
262 #define KEY_N 49
263 #define KEY_M 50
264 #define KEY_COMMA 51
265 #define KEY_DOT 52
266 #define KEY_SLASH 53
267 #define KEY_RIGHTSHIFT 54
268 #define KEY_KPASTERISK 55
269 #define KEY_LEFTALT 56
270 #define KEY_SPACE 57
271 #define KEY_CAPSLOCK 58
272 #define KEY_F1 59
273 #define KEY_F2 60
274 #define KEY_F3 61
275 #define KEY_F4 62
276 #define KEY_F5 63
277 #define KEY_F6 64
278 #define KEY_F7 65
279 #define KEY_F8 66
280 #define KEY_F9 67
281 #define KEY_F10 68
282 #define KEY_NUMLOCK 69
283 #define KEY_SCROLLLOCK 70
284 #define KEY_KP7 71
285 #define KEY_KP8 72
286 #define KEY_KP9 73
287 #define KEY_KPMINUS 74
288 #define KEY_KP4 75
289 #define KEY_KP5 76
290 #define KEY_KP6 77
291 #define KEY_KPPLUS 78
292 #define KEY_KP1 79
293 #define KEY_KP2 80
294 #define KEY_KP3 81
295 #define KEY_KP0 82
296 #define KEY_KPDOT 83
297
298 #define KEY_ZENKAKUHANKAKU 85
299 #define KEY_102ND 86
300 #define KEY_F11 87
301 #define KEY_F12 88
302 #define KEY_RO 89
303 #define KEY_KATAKANA 90
304 #define KEY_HIRAGANA 91
305 #define KEY_HENKAN 92
306 #define KEY_KATAKANAHIRAGANA 93
307 #define KEY_MUHENKAN 94
308 #define KEY_KPJPCOMMA 95
309 #define KEY_KPENTER 96
310 #define KEY_RIGHTCTRL 97
311 #define KEY_KPSLASH 98
312 #define KEY_SYSRQ 99
313 #define KEY_RIGHTALT 100
314 #define KEY_LINEFEED 101
315 #define KEY_HOME 102
316 #define KEY_UP 103
317 #define KEY_PAGEUP 104
318 #define KEY_LEFT 105
319 #define KEY_RIGHT 106
320 #define KEY_END 107
321 #define KEY_DOWN 108
322 #define KEY_PAGEDOWN 109
323 #define KEY_INSERT 110
324 #define KEY_DELETE 111
325 #define KEY_MACRO 112
326 #define KEY_MUTE 113
327 #define KEY_VOLUMEDOWN 114
328 #define KEY_VOLUMEUP 115
329 #define KEY_POWER 116 /* SC System Power Down */
330 #define KEY_KPEQUAL 117
331 #define KEY_KPPLUSMINUS 118
332 #define KEY_PAUSE 119
333 #define KEY_SCALE 120 /* AL Compiz Scale (Expose) */
334
335 #define KEY_KPCOMMA 121
336 #define KEY_HANGEUL 122
337 #define KEY_HANGUEL KEY_HANGEUL
338 #define KEY_HANJA 123
339 #define KEY_YEN 124
340 #define KEY_LEFTMETA 125
341 #define KEY_RIGHTMETA 126
342 #define KEY_COMPOSE 127
343
344 #define KEY_STOP 128 /* AC Stop */
345 #define KEY_AGAIN 129
346 #define KEY_PROPS 130 /* AC Properties */
347 #define KEY_UNDO 131 /* AC Undo */
348 #define KEY_FRONT 132
349 #define KEY_COPY 133 /* AC Copy */
350 #define KEY_OPEN 134 /* AC Open */
351 #define KEY_PASTE 135 /* AC Paste */
352 #define KEY_FIND 136 /* AC Search */
353 #define KEY_CUT 137 /* AC Cut */
354 #define KEY_HELP 138 /* AL Integrated Help Center */
355 #define KEY_MENU 139 /* Menu (show menu) */
356 #define KEY_CALC 140 /* AL Calculator */
357 #define KEY_SETUP 141
358 #define KEY_SLEEP 142 /* SC System Sleep */
359 #define KEY_WAKEUP 143 /* System Wake Up */
360 #define KEY_FILE 144 /* AL Local Machine Browser */
361 #define KEY_SENDFILE 145
362 #define KEY_DELETEFILE 146
363 #define KEY_XFER 147
364 #define KEY_PROG1 148
365 #define KEY_PROG2 149
366 #define KEY_WWW 150 /* AL Internet Browser */
367 #define KEY_MSDOS 151
368 #define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
369 #define KEY_SCREENLOCK KEY_COFFEE
370 #define KEY_DIRECTION 153
371 #define KEY_CYCLEWINDOWS 154
372 #define KEY_MAIL 155
373 #define KEY_BOOKMARKS 156 /* AC Bookmarks */
374 #define KEY_COMPUTER 157
375 #define KEY_BACK 158 /* AC Back */
376 #define KEY_FORWARD 159 /* AC Forward */
377 #define KEY_CLOSECD 160
378 #define KEY_EJECTCD 161
379 #define KEY_EJECTCLOSECD 162
380 #define KEY_NEXTSONG 163
381 #define KEY_PLAYPAUSE 164
382 #define KEY_PREVIOUSSONG 165
383 #define KEY_STOPCD 166
384 #define KEY_RECORD 167
385 #define KEY_REWIND 168
386 #define KEY_PHONE 169 /* Media Select Telephone */
387 #define KEY_ISO 170
388 #define KEY_CONFIG 171 /* AL Consumer Control Configuration */
389 #define KEY_HOMEPAGE 172 /* AC Home */
390 #define KEY_REFRESH 173 /* AC Refresh */
391 #define KEY_EXIT 174 /* AC Exit */
392 #define KEY_MOVE 175
393 #define KEY_EDIT 176
394 #define KEY_SCROLLUP 177
395 #define KEY_SCROLLDOWN 178
396 #define KEY_KPLEFTPAREN 179
397 #define KEY_KPRIGHTPAREN 180
398 #define KEY_NEW 181 /* AC New */
399 #define KEY_REDO 182 /* AC Redo/Repeat */
400
401 #define KEY_F13 183
402 #define KEY_F14 184
403 #define KEY_F15 185
404 #define KEY_F16 186
405 #define KEY_F17 187
406 #define KEY_F18 188
407 #define KEY_F19 189
408 #define KEY_F20 190
409 #define KEY_F21 191
410 #define KEY_F22 192
411 #define KEY_F23 193
412 #define KEY_F24 194
413
414 #define KEY_PLAYCD 200
415 #define KEY_PAUSECD 201
416 #define KEY_PROG3 202
417 #define KEY_PROG4 203
418 #define KEY_DASHBOARD 204 /* AL Dashboard */
419 #define KEY_SUSPEND 205
420 #define KEY_CLOSE 206 /* AC Close */
421 #define KEY_PLAY 207
422 #define KEY_FASTFORWARD 208
423 #define KEY_BASSBOOST 209
424 #define KEY_PRINT 210 /* AC Print */
425 #define KEY_HP 211
426 #define KEY_CAMERA 212
427 #define KEY_SOUND 213
428 #define KEY_QUESTION 214
429 #define KEY_EMAIL 215
430 #define KEY_CHAT 216
431 #define KEY_SEARCH 217
432 #define KEY_CONNECT 218
433 #define KEY_FINANCE 219 /* AL Checkbook/Finance */
434 #define KEY_SPORT 220
435 #define KEY_SHOP 221
436 #define KEY_ALTERASE 222
437 #define KEY_CANCEL 223 /* AC Cancel */
438 #define KEY_BRIGHTNESSDOWN 224
439 #define KEY_BRIGHTNESSUP 225
440 #define KEY_MEDIA 226
441
442 #define KEY_SWITCHVIDEOMODE 227 /* Cycle between available video
443 outputs (Monitor/LCD/TV-out/etc) */
444 #define KEY_KBDILLUMTOGGLE 228
445 #define KEY_KBDILLUMDOWN 229
446 #define KEY_KBDILLUMUP 230
447
448 #define KEY_SEND 231 /* AC Send */
449 #define KEY_REPLY 232 /* AC Reply */
450 #define KEY_FORWARDMAIL 233 /* AC Forward Msg */
451 #define KEY_SAVE 234 /* AC Save */
452 #define KEY_DOCUMENTS 235
453
454 #define KEY_BATTERY 236
455
456 #define KEY_BLUETOOTH 237
457 #define KEY_WLAN 238
458 #define KEY_UWB 239
459
460 #define KEY_UNKNOWN 240
461
462 #define KEY_VIDEO_NEXT 241 /* drive next video source */
463 #define KEY_VIDEO_PREV 242 /* drive previous video source */
464 #define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */
465 #define KEY_BRIGHTNESS_AUTO 244 /* Set Auto Brightness: manual
466 brightness control is off,
467 rely on ambient */
468 #define KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO
#define KEY_DISPLAY_OFF 245 /* display device to off state */
#define KEY_WWAN 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */
#define KEY_WIMAX KEY_WWAN
#define KEY_RFKILL 247 /* Key that controls all radios */
#define KEY_MICMUTE 248 /* Mute / unmute the microphone */