我设法以编程方式(C 代码)将多点触控事件注入到我的 LG 设备上/dev/input/event0
。但是按键注入没有成功。我确实能够通过注入密钥,adb shell input keyevent
但我没有看到/dev/input/event*
文件中发生任何事情。看起来他们都没有收到任何东西。有谁知道如何本地化文件注入密钥的位置?提前致谢。
更新:
初始化设备代码:
ioctl (obj->m_fd, UI_SET_EVBIT, EV_KEY);
ioctl (obj->m_fd, UI_SET_KEYBIT, BTN_TOUCH);
ioctl (obj->m_fd, UI_SET_KEYBIT, KEY_BACK);
ioctl (obj->m_fd, UI_SET_KEYBIT, KEY_HOMEPAGE);
for (i = KEY_RESERVED; i <= KEY_UNKNOWN; i++)
ioctl(obj->m_fd, UI_SET_KEYBIT, i);
ioctl (obj->m_fd, UI_SET_EVBIT, EV_ABS);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_X);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_Y);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_TOUCH_MAJOR);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID);
ioctl (obj->m_fd, UI_SET_ABSBIT, ABS_MT_PRESSURE);
注入触摸事件代码(工作)
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_TRACKING_ID, 0 );
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_POSITION_X, obj->x );
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_POSITION_Y, obj->y );
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_TOUCH_MAJOR, obj->sq );
intSendEvent( obj->m_fd, EV_ABS, ABS_MT_PRESSURE, obj->pr );
intSendEvent( obj->m_fd, EV_SYN, SYN_MT_REPORT, 0);
intSendEvent( obj->m_fd, EV_SYN, SYN_REPORT, 0);
intSendEvent( obj->m_fd, EV_SYN, SYN_MT_REPORT, 0);
intSendEvent( obj->m_fd, EV_SYN, SYN_REPORT, 0);
在哪里注入按键代码KEY_RESERVED <= obj->keyCode <=KEY_UNKNOWN
(不起作用)
intSendEvent(obj->m_fd, EV_KEY, obj->keyCode, 1);
intSendEvent( obj->m_fd, EV_SYN, SYN_REPORT, 0);
intSendEvent(obj->m_fd, EV_KEY, obj->keyCode, 0);
intSendEvent( obj->m_fd, EV_SYN, SYN_REPORT, 0);
发送事件函数
void intSendEvent(int fd_kb,int type, int code, int value)
{
debug("intSendEvent call (%d,%d,%d,%d)", fd_kb, type, code, value);
struct uinput_event event;
int len;
if (fd_kb <= fileno(stderr))
return;
memset(&event, 0, sizeof(event));
event.type = type;
event.code = code;
event.value = value;
len = write( fd_kb, &event, sizeof(event) );
debug("intSendEvent done:%d",len);
}