2

LG デバイスにプログラム (C コード) でマルチタッチ イベントを挿入することができました/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);
}
4

1 に答える 1

0

さて、私が取り組んでいるデバイスにはキーボードが組み込まれていないため、にデバイスファイルがないため、デバイスファイルに/dev/inputテキストを直接挿入することは不可能に見えます。しかし、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 

これは数字の注入には十分であり、私にとっては十分です。はadb shell input keyevent ...仮想キーボードで動作するため、デバイス ファイルは使用されません (thanks Chris Stratton )

于 2013-10-29T14:56:51.553 に答える