我可以阻止 Linux 将 USB 输入设备作为键盘监听,但仍然使用程序捕获事件吗?

我可以阻止 Linux 将 USB 输入设备作为键盘监听,但仍然使用程序捕获事件吗?

/dev/input/event0我在( )处有一个 USB 条形码扫描仪/dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd,扫描条形码会导致它发送按键事件。我正在使用捕获这些按键库开发输入Ruby 库,效果很好。问题在于,每个条形码还作为用户名输入,随后在 Raspberry Pi 上输入密码,导致大量登录尝试失败。 (Raspberry Pi 是无头的,并且位于微波炉内。)

如何阻止 Linux 将条形码扫描仪视为输入设备,并使我的程序成为唯一的事件使用者?或者有不同的、更好的解决方案吗?

答案1

我发现我需要发送一个EVIOCGRAB ioctl 到设备,抓取它以供独占使用

以下是在 Ruby 中执行此操作的方法:

#!/usr/bin/env ruby
BARCODE_SCANNER = "/dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd"

require 'rubygems'
require 'libdevinput'
require 'ffi'
require 'ffi/tools/const_generator'

# We need access to the file
DevInput.class_eval { attr_reader :dev }

# Look up value of EVIOCGRAB constant
cg = FFI::ConstGenerator.new('input') do |gen|
  gen.include('linux/input.h')
  gen.const(:EVIOCGRAB, '%u', '(unsigned)')
end
EVIOCGRAB = cg['EVIOCGRAB'].to_i

scanner = DevInput.new(BARCODE_SCANNER)
# Send EVIOCGRAB to scanner, which grabs it for exclusive use by our process
scanner.dev.ioctl(EVIOCGRAB, 1)


puts "Waiting for events..."
scanner.each do |event|
  # Ignore everything except key press events
  next unless event.type == 1 && event.value == 1
  puts "Key: #{event.code_str}"
end

笔记:您需要安装libdevinputgem、ffi和 Linux 标头。如果您使用的是3.2.0和之间的 Linux 版本3.6.11,则可以将FFI::ConstGenerator部分替换为EVIOCGRAB = 1074021776, 然后就不需要ffi或 Linux 标头。

答案2

听起来有点相似这个问题,所以我会尝试这个解决方案 :如果我正确理解你的问题,那么当你这样做时,条形码扫描仪应该显示为“虚拟核心键盘”的从属指针

xinput --list

然后也许获取它的 ID 并强制它浮动可能会有所帮助:

xinput float <id>

相关内容