-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <unistd.h>
-
#include <fcntl.h>
-
#include <errno.h>
-
#include <linux/input.h>
-
#include <linux/uinput.h>
-
-
-
void usage(void)
-
{
-
printf(" Usage : keyboard <kye number> [key number...]\n");
-
printf(" keyboard 29 56 32 /* CTRL + ALT +D */\n");
-
printf(" keyboard 125 32 /* WIN +D */\n");
-
printf("/* Types of key number are defined in /usr/include/linux/input.h */\n");
-
-
return;
-
}
-
-
/* Setup the uinput device */
-
int setup_uinput_device(int fd)
-
{
-
struct uinput_user_dev uidev; // uInput device structure
-
-
memset(&uidev, 0, sizeof(struct
uinput_user_dev)); // Intialize
the uInput device to NULL
-
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-keyboard");
-
uidev.id.bustype = BUS_USB;
-
uidev.id.vendor = 0x1;
-
uidev.id.product = 0x1;
-
uidev.id.version = 1;
-
// Setup the driver I/O channels
-
ioctl(fd, UI_SET_EVBIT, EV_KEY);
-
ioctl(fd, UI_SET_KEYBIT, BTN_LEFT);
-
for (int i = 0; i < 256; i++) {
-
ioctl(fd, UI_SET_KEYBIT, i);
-
}
-
ioctl(fd, UI_SET_EVBIT, EV_REL);
-
ioctl(fd, UI_SET_RELBIT, REL_X);
-
ioctl(fd, UI_SET_RELBIT, REL_Y);
-
-
/* Create input device into input sub-system */
-
write(fd, &uidev, sizeof(struct
uinput_user_dev));
-
if (ioctl(fd, UI_DEV_CREATE) < 0) {
-
printf("error: create uinput device\n");
-
return -1;
-
}
-
-
return 0;
-
}
-
-
void uinput_key(int fd, int keycode, int keyvalue)
-
{
-
struct input_event ev; // Input device structure
-
-
memset(&ev, 0, sizeof(struct
input_event));
-
gettimeofday(&ev.time, NULL);
-
ev.type = EV_KEY;
-
ev.code = keycode;
-
ev.value = keyvalue;
-
if (write(fd, &ev, sizeof(struct
input_event)) < 0) {
-
printf("uinput key error\n");
-
return;
-
} else {
-
printf("uinput key %d, %d\n", keycode, keyvalue);
-
}
-
-
return;
-
}
-
-
void uinput_key_end(int fd)
-
{
-
struct input_event ev; // Input device structure
-
-
memset(&ev, 0, sizeof(struct
input_event));
-
ev.type = EV_SYN;
-
ev.code = 0;
-
ev.value = 0;
-
write(fd, &ev, sizeof(struct
input_event));
-
-
return;
-
}
-
-
//check the key is control key
-
int check_valid_control_key(int key)
-
{
-
int ret = 0;
-
int control_key[] = {29, 42, 54, 56, 97, 100, 125, 126};
-
int len = sizeof(control_key) / sizeof(control_key[0]);
-
-
for (int i = 0; i < len; i++) {
-
if (control_key[i] == key) {
-
ret = 1;
-
break;
-
}
-
}
-
-
return ret;
-
}
-
-
int main(int argc, char *argv[])
-
{
-
int fd = -1;
-
int key;
-
int i;
-
-
if (argc <= 1) {
-
usage();
-
return -1;
-
}
-
-
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); // Open
the input device
-
if (fd < 0) {
-
printf("error: open /dev/uinput\n");
-
return -1;
-
}
-
-
setup_uinput_device(fd);
-
-
sleep(1);
-
-
for (i = 1; i < argc; i++) {
-
key = atoi(argv[i]);
-
uinput_key(fd, key, 1);
-
if (check_valid_control_key(key) == 0) {
-
uinput_key(fd,key, 0);
-
}
-
}
-
-
for (i = 1; i < argc; i++) {
-
key = atoi(argv[i]);
-
if (check_valid_control_key(key) == 1) {
-
uinput_key(fd,key, 0);
-
}
-
}
-
-
uinput_key_end(fd);
-
if (ioctl(fd, UI_DEV_DESTROY) < 0) {
-
printf("error: ioctl");
-
return -1;
-
}
-
-
close(fd);
-
fd = -1;
-
-
return 0;
- }
uinput
最新推荐文章于 2023-12-24 20:03:13 发布
1680

被折叠的 条评论
为什么被折叠?



