我设法以编程方式(C 代码)在我的 LG 设备上注入(inject)多点触控事件,将它们注入(inject)到 /dev/input/event0
中。 .
但是按键注入(inject)没有成功。我确实能够通过 adb shell input keyevent
注入(inject) key 但我在 /dev/input/event*
中没有看到任何事情发生文件。看起来他们都没有收到任何东西。有人知道如何将文件本地化到注入(inject) key 的位置吗?
提前致谢。
更新:
初始化设备代码:
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);
注入(inject)触摸事件代码(有效)
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
处注入(inject)按键代码(不工作)
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);
}
最佳答案
好吧,看起来我正在使用的设备没有内置键盘,因此 /dev/input
上没有设备文件,所以直接将文本注入(inject)设备文件看起来不可能。但是 getevent -lit
命令说我有以下设备:
add device 2: /dev/input/event6
bus: 0000
vendor 0000
product 0000
version 0000
name: "ats_input"
location: ""
id: ""
version: 1.0.1
events:
KEY (0001): KEY_ESC KEY_1 KEY_2 KEY_3
KEY_4 KEY_5 KEY_6 KEY_7
KEY_8 KEY_9 KEY_0 KEY_END
KEY_VOLUMEDOWN KEY_VOLUMEUP KEY_POWER KEY_SEND
KEY_NUMERIC_0 KEY_NUMERIC_1 KEY_NUMERIC_2 KEY_NUMERIC_3
KEY_NUMERIC_4 KEY_NUMERIC_5 KEY_NUMERIC_6 KEY_NUMERIC_7
KEY_NUMERIC_8 KEY_NUMERIC_9 KEY_NUMERIC_STAR KEY_NUMERIC_POUND
ABS (0003): ABS_MT_TOUCH_MAJOR
这对数字注入(inject)来说已经足够好了,对我来说也足够了。
adb shell input keyevent ...
使用虚拟键盘,因此没有使用设备文件(感谢 Chris Stratton)
关于android - 哪个设备文件接收我在 Android 上注入(inject)的 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19568296/