linuxでキーレスポンスイベントを取得

4526 ワード

1、問題
キーボード対応のデバイスファイルをデッドサイクルで読み込むと、キーボードイベントが画面に印刷され、escを押してプログラムを終了します.
コードはunbuntu 10です.04コンパイル実行済み
2、input_イベントの説明
Linuxカーネルでは、inputデバイス用input_dev構造体記述、inputサブシステムを用いて入力装置駆動を実現する際、駆動の核心的な仕事は、ボタン、タッチスクリーン、キーボード、マウスなどの入力イベント(event、input_event構造体記述を通じて)をシステムに報告することであり、Inputサブシステムがファイル操作インタフェースを完了したため、ファイル操作インタフェースに関心を持つ必要はない.
linux/input.hこのファイルはeventイベントの構造体、APIと標準ボタンの符号化などを定義している.
struct input_event {
    struct timeval time;//キータイム
    __u16 type;//イベントのタイプ
    __u16 code;//どのキーにシミュレートするか
    __s32 value;//押すか放すか
};
typeは、イベントタイプを指し、一般的なイベントタイプは次のとおりです.
EV_KEY、キーイベント、例えばキーボードのキー(どのキーを押すか)、マウスの左ボタン右ボタン(非クリック)など;
EV_REL、相対座標、主にマウスの移動イベント(相対変位)を指す.
EV_ABS、絶対座標、主にタッチパネルの移動イベントを指す
code:イベントのコード.
イベントのタイプコードがEV_の場合KEY,このコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコード
キーコードの定義については、次のセクションで説明します.
#define KEY_RESERVED     0
#define KEY_ESC  1
#define KEY_1    2
#define KEY_2    3
#define KEY_3    4
#define KEY_4    5
#define KEY_5    6
#define KEY_6    7
#define KEY_7    8
#define KEY_8    9
#define KEY_9    10
#define KEY_0    11
#define KEY_MINUS    12
#define KEY_EQUAL    13
#define KEY_BACKSPACE    14
#define KEY_TAB  15
#define KEY_Q    16
#define KEY_W    17
#define KEY_E    18
#define KEY_R    19
#define KEY_T    20
value:
イベントの値イベントのタイプコードがEV_の場合KEYは、キーを押すと値が1になり、離すと値が0になる.イベントのタイプコードがEV_の場合REL,valueの正の値と負の値はそれぞれ2つの異なる方向の値を表す.
3、関連コード
key_simulator.c
#include
#include
#include
#include
#include

int main ()
{
  int keys_fd;
  char ret[2];
  struct input_event t;

  keys_fd = open ("/dev/input/event2", O_RDONLY);
  if (keys_fd <= 0)
    {
      printf ("open /dev/input/event2 device error!
"); return 0; } while (1) { if (read (keys_fd, &t, sizeof (t)) == sizeof (t)) { if (t.type == EV_KEY) if (t.value == 0 || t.value == 1) { printf ("key %d %s
", t.code, (t.value) ? "Pressed" : "Released"); if(t.code==KEY_ESC) break; } } } close (keys_fd); return 0; }

4、注意
1)異なるタイプのコンピュータでは,デバイス対応event情報が異なる.
catで取得できるデバイスはevent情報に対応します.
# cat/proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
U: Uniq=
H: Handlers=kbd event0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0017 Vendor=0001 Product=0001 Version=0100
N: Name="Macintosh mouse button emulation"
P: Phys=
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=mouse0 event1
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=3
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input2
U: Uniq=
H: Handlers=kbd event2
B: EV=120013
B: KEY=4 2000000 3803078 f800d001 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name="ImPS/2 Generic Wheel Mouse"
P: Phys=isa0060/serio1/input0
S: Sysfs=/devices/platform/i8042/serio1/input/input3
U: Uniq=
H: Handlers=mouse1 event3
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
I line:この行にはアイデンティティ情報が含まれており、bus typeが3(usb)、vendor、product、versionなどの情報が表示されています.
N line:この行には名前情報が含まれています.
P line:この行には物理デバイス情報が含まれています.
H line:この行には、デバイスに関連付けられたhandler driversが含まれています.
B line:これらの行には、デバイスの能力を表示するビットドメイン(bitfield)が含まれています.
私のキーボードに対応するイベントタイプはevent 2です.
2)open/dev/input/event2 device error
sudoを使用するか、デバイスのプロパティを変更する必要があります.
次のようになります.
sudo ./key_simulator
または
chmod 777/dev/input/event2
本文は転載を歓迎して、転載して作者と出典を明記してください
作者:流星
出典:http://blog.sina.com.cn/staratsky