linuxのキーボード同時押し
Posted: 2014年1月07日(火) 17:43
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <sys/time.h>
int main(void)
{
struct timeval tv, tv0 = { 0 };
struct termios t, t0;
char c, c0 = 0;
long ti;
tcgetattr(0, &t);
t0 = t;
t.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
t.c_oflag &= ~OPOST;
t.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
t.c_cflag &= ~(CSIZE | PARENB);
t.c_cflag |= CS8;
tcsetattr(0, TCSANOW, &t);
while (1) {
read(0, &c, 1);
gettimeofday(&tv, 0);
ti = (tv.tv_sec - tv0.tv_sec) * 1000000 + (tv.tv_usec - tv0.tv_usec);
if (ti < 100000) {
printf(" %c %c\n", c0, c);
break;
}
tv0 = tv;
c0 = c;
printf("%c\n", c);
fflush(stdout);
}
tcsetattr(0, TCSANOW, &t0);
return 0;
}
tv0 の初期値を 0 にして、ti を求めるときに * 100000 でかずま さんが書きました:こんなのは、いかがですか?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <sys/time.h>
int main(void)
{
struct timeval tv, tv0;
struct termios t, t0;
int c, c0 = 0;
long ti;
gettimeofday(&tv0, 0);
tcgetattr(0, &t);
t0 = t;
t.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
t.c_oflag &= ~OPOST;
t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN);
t.c_cflag &= ~(CSIZE | PARENB);
t.c_cflag |= CS8;
tcsetattr(0, TCSANOW, &t);
while (1) {
c = getchar();
gettimeofday(&tv, 0);
ti = (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000;
if (ti < 100) break;
tv0 = tv;
c0 = c;
printf("%c\r\n", c);
}
printf(" %c %c\r\n", c0, c);
tcsetattr(0, TCSANOW, &t0);
return 0;
}
#include <stdio.h>
#include "SDL.h"
int Key[SDLK_LAST]; // キーが押されているフレーム数を格納する
int gpUpdateKey()
{
Uint8 *tmpKey; // 現在のキーの入力状態を格納する
tmpKey = SDL_GetKeyState(NULL);
SDL_PumpEvents();
for(int i=0; i < SDLK_LAST; i++ )
{
if( tmpKey[i] != 0) // i番のキーコードに対応するキーが押されていたら
{
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}