2018年12月30日 星期日

21-sendevent

上回咱們說到怎麼利用 getevent 得到 Android 的輸入事件,本次就來說明如何使用 sendevent 模擬輸入的動作。

語法 sendevent device type code value
說明 device: 輸入設備代號,如 /dev/input/event0
type: 須以十進位指定此值,如 EV_KEY (0x01) 為 1,EV_ABS (0x03) 為 3,參閱 input.h
code: 須以十進位指定此值,如 ABS_MT_POSITION_X (0x35) 為 53,ABS_MT_POSITION_Y (0x36) 為 54,參閱 input.h
value: 表示 code 的強度,須以十進位指定此值。

以在 ASUS Z00LD (Android 6.0.1) 按一次音量增大鍵為例:
C:\Users\tester>adb shell "sendevent /dev/input/event7 1 115 1; sendevent /dev/input/event7 0 0 0; sendevent /dev/input/event7 1 115 0; sendevent /dev/input/event7 0 0 0"

此 shell 指令是由 4 個輸入事件組成:
事件順序 輸入事件 說明
1 sendevent /dev/input/event7 1 115 1 1: EV_KEY
115: KEY_VOLUMEUP
1: DOWN(由 getevent.h 的 key_value_labels 得知)
2 sendevent /dev/input/event7 0 0 0 0: EV_SYN
0: SYN_REPORT
0: SYN_REPORT 所表示的值(以 getevent 做實驗得知)
3 sendevent /dev/input/event7 1 115 0 1: EV_KEY
115: KEY_VOLUMEUP
0: UP(由 getevent.h 的 key_value_labels 得知)
4 sendevent /dev/input/event7 0 0 0 0: EV_SYN
0: SYN_REPORT
0: SYN_REPORT 所表示的值(以 getevent 做實驗得知)

若瞭解如何以 sendevent 模擬 press 的話,相信各位看官一定能舉一反三觸類旁通,知道如何模擬長按按鍵、點擊螢幕、長按螢幕、以及拖曳等各式動作了。

但有一點必須特別注意:此方法的移植性並不高。
姑且不論輸入設備代號會因機型而異,其能響應的輸入事件也有差別,雖然這並非無解,但一旦有新機型出來,模擬腳本就會面臨較高的修改風險,所以本喵認為應該適度使用,不要過度依賴此方法。

沒有留言:

張貼留言