キーボード入力を取得する出来損ないを作ってみた
右側の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先生は.
参考にさせてもらったりソースを一部流用させてもらったサイト
これらのページが無かったら絶対自分にはムリ.