ฉันพบว่าฉันจะต้องส่งIOCTL EVIOCGRAB ไปยังอุปกรณ์ที่คว้ามันสำหรับการใช้งานพิเศษ
นี่คือวิธีการทำใน 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
gem ffi
, และส่วนหัวของ Linux หากคุณใช้รุ่น Linux ระหว่าง3.2.0
และ3.6.11
คุณสามารถแทนที่FFI::ConstGenerator
ส่วนด้วยEVIOCGRAB = 1074021776
แล้วคุณไม่ต้องการffi
หรือส่วนหัว Linux