キーボード入力を取得する出来損ないを作ってみた

右側のCTRL, ALT, SHIFTとAキーにのみ対応.
そのいずれかのキーが入力されたら○○が押されましたと端末上に出力するだけ.
実行にはroot権限が必要.



とりあえずソース.
作るにあたって色々なサイトを参考にさせてもらった.
だから結構理解せずに書いてる部分もあったり.

#include<iostream>

#include<sys/time.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

#include<linux/input.h>

using namespace std;

int main( int argc, char *argv[] )
{
  fd_set         rfds;
  struct timeval tv;
  int            retval;
  int            ctrl_pressed  = 0; /* 0: release 1: press */
  int            shift_pressed = 0; /* 0: release 1: press */
  int            alt_pressed   = 0; /* 0: release 1: press */

  int fd = open( "/dev/input/event0", O_RDONLY );

  while(1){
    FD_ZERO( &rfds );
    FD_SET( fd, &rfds );

    tv.tv_sec  = 10;
    tv.tv_usec = 0;

    retval = select( fd+1, &rfds, NULL, NULL, &tv );

    if( retval == -1 ){
      perror( "select()" );
    } else if ( retval ){
      struct input_event ev;

      if( read( fd, &ev, sizeof(ev) ) != sizeof(ev) ){
        exit( EXIT_FAILURE );
      }

      switch( ev.type ){
      case EV_KEY:
        switch( ev.code ){
        case KEY_RIGHTCTRL:
          if( ev.value > 0 ){
            ctrl_pressed = 1;
          } else {
            ctrl_pressed = 0;
          }
          cout << "右CTRLキーが押されました." << endl;
          break;
        case KEY_RIGHTSHIFT:
          if( ev.value > 0 ){
            shift_pressed = 1;
          } else {
            shift_pressed = 0;
          }
          cout << "右SHIFTキーが押されました." << endl;
          break;
        case KEY_RIGHTALT:
          if( ev.value > 0 ){
            alt_pressed = 1;
          } else {
            alt_pressed = 0;
          }
          cout << "右ALTキーが押されました." << endl;
          break;
        case KEY_A:
          if( ctrl_pressed && shift_pressed && alt_pressed ){
            cout << "CTRL + SHIFT + ALT + Aキーが押されました." << endl;
          } else if( ctrl_pressed && shift_pressed ){
            cout << "CTRL + SHIFT + Aキーが押されました." << endl;
          } else if( ctrl_pressed && alt_pressed ){
            cout << "CTRL + ALT + Aキーが押されました." << endl;
          } else if( shift_pressed && alt_pressed ){
            cout << "ALT + SHIFT + Aキーが押されました." << endl;
          } else if( ctrl_pressed ){
            cout << "CTRL + Aキーが押されました." << endl;
          } else if( shift_pressed ){
            cout << "SHIFT + Aキーが押されました." << endl;
          } else if( alt_pressed ){
            cout << "ALT + Aキーが押されました." << endl;
          } else {
            cout << "Aキーが押されました." << endl;
          }
          break;
        default:
          break;
        }
        break;

      default:
        break;
      }
    }
  }

  return EXIT_SUCCESS;
}

色々問題が有りそう.
キーを押したときと, 離したとき両方を検知しちゃってるし.
人によってopenのevent1とか違うかも.


一応動作例.

[khiker@khlin001 ~/<2>keyboard/eventtest]$ sudo ./keyboard_event
右CTRLキーが押されました.
CTRL + Aキーが押されました.
^ACTRL + Aキーが押されました.
右CTRLキーが押されました.
右ALTキーが押されました.
ALT + Aキーが押されました.
^[aALT + Aキーが押されました.
右ALTキーが押されました.
右SHIFTキーが押されました.
SHIFT + Aキーが押されました.
ASHIFT + Aキーが押されました.
右SHIFTキーが押されました.
右SHIFTキーが押されました.
右SHIFTキーが押されました.
右CTRLキーが押されました.
右CTRLキーが押されました.
右ALTキーが押されました.
右ALTキーが押されました.
Aキーが押されました.
aAキーが押されました.
Aキーが押されました.
aAキーが押されました.
Aキーが押されました.
aAキーが押されました.
右CTRLキーが押されました.
右SHIFTキーが押されました.
右ALTキーが押されました.
CTRL + SHIFT + ALT + Aキーが押されました.
^[^ACTRL + SHIFT + ALT + Aキーが押されました.
右SHIFTキーが押されました.
右ALTキーが押されました.
右CTRLキーが押されました.
右CTRLキーが押されました.
右ALTキーが押されました.
CTRL + ALT + Aキーが押されました.
^[^ACTRL + ALT + Aキーが押されました.
右CTRLキーが押されました.
右ALTキーが押されました.
右CTRLキーが押されました.
右SHIFTキーが押されました.
CTRL + SHIFT + Aキーが押されました.
CTRL + SHIFT + Aキーが押されました.
右CTRLキーが押されました.
右SHIFTキーが押されました.

右ALTキーが押されました.
右SHIFTキーが押されました.
ALT + SHIFT + Aキーが押されました.
^[AALT + SHIFT + Aキーが押されました.
右SHIFTキーが押されました.
右ALTキーが押されました.
右CTRLキーが押されました.

最初CTRL+○○の検出に困った.
でも, Google先生で根気よく検索したらちゃんと出てきた.
やっぱ偉大だね, Google先生は.

参考にさせてもらったりソースを一部流用させてもらったサイト

これらのページが無かったら絶対自分にはムリ.