目的:用c语言模拟键盘输入,这里是按下NUMLOCK键,等待2秒后,再按一次。
问题:如果不用sleep()函数,按1次或两次NUMLOCK键的程序,看到的NUMLOCK灯的状态与预期一致。
当用了sleep()函数后,再运行程序,会看到NUMLOCK灯亮起,直至程序结束也不熄灭,这时再用手在键盘上随便按一个键,NUMLOCK灯才熄灭。
代码:
#include <linux/input.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void simulate_key(int fd, unsigned int keycode, int keyvalue)
{
struct input_event event;
event.type = EV_KEY;
event.code = keycode;
event.value = keyvalue;
gettimeofday(&event.time, 0);
if (write(fd, &event, sizeof(event)) < 0) {
printf("simulate key error\n");
return;
}else
printf("simuate key %d, %d\n", keycode, keyvalue);
}
int main ( int argc, char *argv[] )
{
char *path = "/dev/input/event3";
unsigned int key_code = KEY_NUMLOCK;
if (argc >= 3) {
path = argv[1];
key_code = atoi(argv[2]);
}else if (argc >= 2)
path = argv[1];
int fd_kbd = open(path, O_RDWR);
if(fd_kbd <= 0) {
printf("error open keyboard:%s\n", strerror(errno));
return -1;
}
simulate_key(fd_kbd, key_code, 1);
simulate_key(fd_kbd, key_code, 0);
sleep(2);
simulate_key(fd_kbd, key_code, 1);
simulate_key(fd_kbd, key_code, 0);
close(fd_kbd);
return 0;
} /* ---------- end of function main ---------- */
运行结果:
simuate key 69, 1
simuate key 69, 0
(此处灯已亮,程序停2秒)
simuate key 69, 1
simuate key 69, 0
(此处程序已结束,灯仍亮)
(随便在键盘敲一个键,灯灭)
大话西游666
慕尼黑的夜晚无繁华