2012-09-01 15 views
6

Tôi đang viết một chương trình Linux trong C, và tôi cần phải chặn một số nét bàn phím nhất định.Làm thế nào để comsume một sự kiện bàn phím trên Linux bằng cách sử dụng hệ thống con đầu vào

Sử dụng subytem đầu vào (đọc/ghi/dev/input/eventX), tôi có thể nhận đột quỵ bàn phím (sử dụng chức năng "đọc") hoặc mô phỏng đột quỵ (sử dụng chức năng "viết").

Khi sử dụng chức năng "đọc", tôi có thể chụp các nét bàn phím của người dùng, nhưng sự kiện này được truyền đi và tôi không biết cách sử dụng nó.

+0

Demo mã số: int devfd = open (thiết bị, ...);/* Mở thiết bị hạt nhân "/ dev/input/eventX". */ đọc (devfd, ...);/* Đọc một sự kiện bàn phím. */ ghi (devfd, ...);/* Mô phỏng một sự kiện bàn phím. */ – zccoding

+2

Không cần phải bình luận câu hỏi của riêng bạn. Bạn có thể chỉnh sửa câu hỏi để bao gồm bất kỳ chi tiết nào khác và định dạng nguồn. Hãy chắc chắn rằng nguồn của bạn là rõ ràng cho những người sẽ trả lời. – bytebuster

Trả lời

5

Theo mặc định, các sự kiện đầu vào được truyền tới tất cả các ứng dụng và trình điều khiển nghe. Tuy nhiên, có thể để ứng dụng lấy thiết bị qua giao diện evdev - hãy xem EVIOCGRABioctl(). Điều đó sẽ chỉ cho phép ứng dụng cụ thể đó nhận các sự kiện từ thiết bị cụ thể đó.

Vấn đề với cách tiếp cận đó là bạn không thể thực sự ngăn chặn một sự kiện cụ thể khỏi bị truyền sau nó nhận được - bạn chỉ có thể lấy các thiết bị trước, sau đó sẽ nắm bắt được tất cả sự kiện. Do đó, nếu bạn muốn lọc sự kiện đầu vào bạn phải sử dụng giải pháp thay thế.

Cách giải quyết mà tôi sử dụng trong evmapd daemon của riêng tôi tham gia grabbing các thiết bị ban đầu và sử dụng các hệ thống phụ uinput để cung cấp một thiết bị khác với tất cả những sửa đổi mà tôi cần, bao gồm các phím ánh xạ và những thay đổi khác nhau ...