Android 模拟按键汇总

出处:http://hi.baidu.com/mgqw/blog/item/ef91923810ca85f8b311c705.html

名词解释:
scancode: 驱动对硬件的标记
keycode: 上层应用程序所见的标记,跟硬件的标记不同, 一般为KEY_F1之类的宏

一般驱动将scancode绑定到keycode
对未绑定的scancode, 可以通过setkeycodes将将其绑定到未使用的keycode
注: 有些按键会被解释成acpi event, 可以通过acpi_listen来监听,但不一定成功,目前还没具体了解

模 拟按键是上层应用程序的行为, 所以不需要编译成模块,只需要想平常的应用程序那样编译就可以了, 不过它要包含<linux/input.h>这个文件, 同时要明确键盘对应的/dev/input/event[0-4]到底是哪个文件, 此外还需要以root权限来运行

赖半仙注解:
运行命令 cat /proc/bus/input/devices  在输出里面查找 xxx keyboard 对应的文件是/dev/input/event几。我开始想当然的以为键盘文件是event1,结果死人都调不出来,弄了很久最后从event0开始一个一个试,才发现我的手提电脑键盘文件对应的是event4。

在我的电脑上运行命令 ls /dev/input/event* 发现有好多输入设备…………
/dev/input/event0  /dev/input/event10  /dev/input/event2  /dev/input/event4  /dev/input/event6  /dev/input/event8
/dev/input/event1  /dev/input/event11  /dev/input/event3  /dev/input/event5  /dev/input/event7  /dev/input/event9


下面是 cat /proc/bus/input/devices 命令对应键盘文件的一段输出
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input4
U: Uniq=
H: Handlers=kbd event4
B: EV=120013
B: KEY=8000 0 0 0 0 0 5007 2002000 380307c f800d001 feffffdf ffefffff ffffffff ffffffff
B: MSC=10
B: LED=7

下面的程序是模拟按键NumLock,就是控制小键盘灯的那个按键,按下去(运行程序没有问题)后小键盘灯就会点亮或者熄灭。


 #include <linux/input.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <stdio.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/event1";
    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);

    close(fd_kbd);

    return 0;
}               /* ----------  end of function main  ---------- */



触发单击屏幕事件

public void myClickEvent(float x, float y) {
        long firstTime = SystemClock.uptimeMillis();
        final MotionEvent firstEvent = MotionEvent.obtain(firstTime, firstTime,
                MotionEvent.ACTION_DOWN, x, y, 0);
    
        long secondTime = firstTime + 30;
        final MotionEvent secondEvent = MotionEvent.obtain(secondTime,
                secondTime, MotionEvent.ACTION_UP, x, y, 0);

        dispatchTouchEvent(firstEvent);
        dispatchTouchEvent(secondEvent);
    }

public void myClickEvent(float x, float y) {
        long firstTime = SystemClock.uptimeMillis();
        final MotionEvent firstEvent = MotionEvent.obtain(firstTime, firstTime,
                MotionEvent.ACTION_DOWN, x, y, 0);
    
        long secondTime = firstTime + 30;
        final MotionEvent secondEvent = MotionEvent.obtain(secondTime,
                secondTime, MotionEvent.ACTION_UP, x, y, 0);

        dispatchTouchEvent(firstEvent);
        dispatchTouchEvent(secondEvent);
    }


sendevent /dev/input/event0  [TYPE] [CODE] [VALUE]

onTouchEvent

KEYCODE_UNKNOWN=0; 

KEYCODE_SOFT_LEFT=1; 

KEYCODE_SOFT_RIGHT=2; 

KEYCODE_HOME=3; 

KEYCODE_BACK=4; 

KEYCODE_CALL=5; 

KEYCODE_ENDCALL=6; 

KEYCODE_0=7; 

KEYCODE_1=8; 

KEYCODE_2=9; 

KEYCODE_3=10; 

KEYCODE_4=11; 

KEYCODE_5=12; 

KEYCODE_6=13; 

KEYCODE_7=14; 

KEYCODE_8=15; 

KEYCODE_9=16; 

KEYCODE_STAR=17; 

KEYCODE_POUND=18; 

KEYCODE_DPAD_UP=19; 

KEYCODE_DPAD_DOWN=20; 

KEYCODE_DPAD_LEFT=21; 

KEYCODE_DPAD_RIGHT=22; 

KEYCODE_DPAD_CENTER=23; 

KEYCODE_VOLUME_UP=24; 

KEYCODE_VOLUME_DOWN=25; 

KEYCODE_POWER=26; 

KEYCODE_CAMERA=27; 

KEYCODE_CLEAR=28; 

KEYCODE_A=29; 

KEYCODE_B=30; 

KEYCODE_C=31; 

KEYCODE_D=32; 

KEYCODE_E=33; 

KEYCODE_F=34; 

KEYCODE_G=35; 

KEYCODE_H=36; 

KEYCODE_I=37; 

KEYCODE_J=38; 

KEYCODE_K=39; 

KEYCODE_L=40; 

KEYCODE_M=41; 

KEYCODE_N=42; 

KEYCODE_O=43; 

KEYCODE_P=44; 

KEYCODE_Q=45; 

KEYCODE_R=46; 

KEYCODE_S=47; 

KEYCODE_T=48; 

KEYCODE_U=49; 

KEYCODE_V=50; 

KEYCODE_W=51; 

KEYCODE_X=52; 

KEYCODE_Y=53; 

KEYCODE_Z=54; 

KEYCODE_COMMA=55; 

KEYCODE_PERIOD=56; 

KEYCODE_ALT_LEFT=57; 

KEYCODE_ALT_RIGHT=58; 

KEYCODE_SHIFT_LEFT=59; 

KEYCODE_SHIFT_RIGHT=60; 

KEYCODE_TAB=61; 

KEYCODE_SPACE=62; 

KEYCODE_SYM=63; 

KEYCODE_EXPLORER=64; 

KEYCODE_ENVELOPE=65; 

KEYCODE_ENTER=66; 

KEYCODE_DEL=67; 

KEYCODE_GRAVE=68; 

KEYCODE_MINUS=69; 

KEYCODE_EQUALS=70; 

KEYCODE_LEFT_BRACKET=71; 

KEYCODE_RIGHT_BRACKET=72; 

KEYCODE_BACKSLASH=73; 

KEYCODE_SEMICOLON=74; 

KEYCODE_APOSTROPHE=75; 

KEYCODE_SLASH=76; 

KEYCODE_AT=77; 

KEYCODE_NUM=78; 

KEYCODE_HEADSETHOOK=79; 

KEYCODE_FOCUS=80;//*Camera*focus 

KEYCODE_PLUS=81; 

KEYCODE_MENU=82; 

KEYCODE_NOTIFICATION=83; 

KEYCODE_SEARCH=84; 

KEYCODE_MEDIA_PLAY_PAUSE=85; 

KEYCODE_MEDIA_STOP=86; 

KEYCODE_MEDIA_NEXT=87; 

KEYCODE_MEDIA_PREVIOUS=88; 

KEYCODE_MEDIA_REWIND=89; 

KEYCODE_MEDIA_FAST_FORWARD=90; 

KEYCODE_MUTE=91; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值