LinuxがUSB入力デバイスをキーボードで受信するのを防ぎながら、プログラムを使用してイベントをキャプチャし続けることはできますか?

LinuxがUSB入力デバイスをキーボードで受信するのを防ぎながら、プログラムを使用してイベントをキャプチャし続けることはできますか?

/dev/input/event0( ) に USB バーコードスキャナーがあり、/dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbdバーコードをスキャンするとキー押下イベントが送信されます.私は以下を使用してこれらのキー押下をキャプチャしています。ライブラリ開発入力Rubyライブラリは素晴らしい作品です。問題は、各バーコードが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

ノートlibdevinput:gemffiとLinuxヘッダーをインストールする必要があります。3.2.0との間のLinuxバージョンを使用している場合は、その部分をに置き換えるか、3.6.11Linuxヘッダーは必要ありません。FFI::ConstGeneratorEVIOCGRAB = 1074021776ffi

答え2

似ているようだこの問題だから試してみましょうこのソリューション :あなたの質問を正しく理解したら、これを行うとバーコードスキャナが「Virtual Core Keyboard」へのスレーブポインタとして現れるはずです。

xinput --list

その後、IDを取得して強制的に浮動させることができます。

xinput float <id>

関連情報