我有一个显示为键盘的 USB 远程演示器。
使用evtest
我可以看到来自设备的输入事件。
如何在 shell 脚本中捕获这些事件?
我见过一些使用的解决方案C
,但我更喜欢仅bash
在可能的情况下使用的解决方案。
我已经尝试过一些xbindkeys
,但我的键盘事件也被捕获,我不希望这样。
我还阅读了一些内容,udev rules
但在我看来,这些规则仅对插入和拔出事件有用。
答案1
@paulequilibrio 感谢你的帖子,我修改了你的脚本,让 mi IR 远程下一个、上一个和停止按钮在 Ubuntu 18.04 中与没有 lirc 的 Rhythmbox 一起使用,这增加了自动运行的奇妙...
device='/dev/input/by-id/usb-Formosa21_Beanbag_Emulation_Device_000052F1-event-if00'
#key_playpause='*type 1 (EV_KEY), code 164 (KEY_PLAYPAUSE), value 1*'
key_stop='*type 1 (EV_KEY), code 128 (KEY_STOP), value 1*'
key_next='*type 1 (EV_KEY), code 407 (KEY_NEXT), value 1*'
key_previous='*type 1 (EV_KEY), code 412 (KEY_PREVIOUS), value 1*'
sudo evtest "$device" | while read line; do
case $line in
# ($key_playpause) notify-send "Play/Pause" && rhythmbox-client --playpause ;;
($key_stop) notify-send "Stop" && rhythmbox-client --stop ;;
($key_next) notify-send "Next" && rhythmbox-client --next ;;
($key_previous) notify-send "Previous" && rhythmbox-client --previous ;;
esac
done
答案2
@JeffSchaller,感谢您的编辑。
根据@IporSircer的回答(谢谢!),我能够创建以下脚本:
#!/bin/bash
device='/dev/input/by-id/usb-Targus_Laser_Presentation_Remote-if02-event-kbd'
event_blank='*code 48 (KEY_B), value 1*'
event_esc='*code 1 (KEY_ESC), value 1*'
event_f5='*code 63 (KEY_F5), value 1*'
event_prev='*code 104 (KEY_PAGEUP), value 1*'
event_next='*code 109 (KEY_PAGEDOWN), value 1*'
evtest "$device" | while read line; do
case $line in
($event_blank) echo "BLANK SCREEN" ;;
($event_f5) echo "F5" ;;
($event_esc) echo "ESCAPE" ;;
($event_prev) echo "PREVIOUS" ;;
($event_next) echo "NEXT" ;;
esac
done
使用evtest
我能够找到/dev/input/event18
设备的事件编号,但该编号可能会有所不同,具体取决于系统上的设备以及它们的连接顺序
因此我曾经udevadm info /dev/input/event18
找出设备的唯一 ID
S: input/by-id/usb-Targus_Laser_Presentation_Remote-if02-event-kbd
最后,evtest
再次使用我能够捕获设备中的所有事件以在case
语句中使用它们。
答案3
此示例是监视触摸板上的点击:
xinput test-xi2 --root "AlpsPS/2 ALPS DualPoint TouchPad" \
| grep --line-buffered "EVENT type 15 (RawButtonPress)"| while read line; do
paplay --volume 22000 -d $PULSE_SINK $HOME/scripts/data/click.aiff
done
您可以根据需要轻松修改它。