C言語関係掲示板

過去ログ

No.1235 キーボードバッファの状態取得

[戻る] [ホームページ]
No.16501

キーボードバッファの状態取得
投稿者---masay(2004/09/02 17:41:37)


こんにちは。

題名のとおりで、キーボードバッファの状態(文字があるか、無いか)
を取得する方法を教えてください。

途中で処理が中断することなく、バッファの状態を知りたいのです。
よろしくお願いします。


No.16502

Re:キーボードバッファの状態取得
投稿者---YuO(2004/09/02 18:15:09)


>題名のとおりで、キーボードバッファの状態(文字があるか、無いか)
>を取得する方法を教えてください。

環境に依存しますので,環境の情報を提示してください。


No.16510

Re:キーボードバッファの状態取得
投稿者---masay(2004/09/03 08:36:22)


>環境に依存しますので,環境の情報を提示してください。

そうなのですか。知りませんでした。
環境は、
WIN2000Pro
VC++6.0
C言語環境(C++ではありません)
です。
環境って、こういうことであってますか??

よろしくお願いいたします。




No.16515

Re:キーボードバッファの状態取得
投稿者---おでん(2004/09/03 09:42:27)


>環境は、
>WIN2000Pro
>VC++6.0
>C言語環境(C++ではありません)
>です。

WindowsAPIのGetAsyncKeyStateあたりを調べると、幸せになれると思います。


No.16519

Re:キーボードバッファの状態取得
投稿者---masay(2004/09/03 10:39:27)


>WindowsAPIのGetAsyncKeyStateあたりを調べると、幸せになれると思います。
ありがとうございます。
調べてみます。


No.16540

ご教授お願いいたします。
投稿者---masay(2004/09/03 15:34:12)


>WindowsAPIのGetAsyncKeyStateあたりを調べると、幸せになれると思います。

調べてみたのですが、わかりませんでした。
どのキーが押されているか?ではなくて、
あくまで、キーボードバッファの中身が空かどうか?を知りたいのです…。

たとえば、scanf()で指定文字数まで読み込む場合、
指定文字数を超えた入力は、キーボードバッファに残っていますよね。
その存在を知りたいのです。

調べ方が悪いのだと思いますが、どうぞよろしくお願いします。


No.16546

Re:ご教授お願いいたします。
投稿者---おでん(2004/09/03 16:02:54)


>>WindowsAPIのGetAsyncKeyStateあたりを調べると、幸せになれると思います。
>
>調べてみたのですが、わかりませんでした。
>どのキーが押されているか?ではなくて、
>あくまで、キーボードバッファの中身が空かどうか?を知りたいのです…。
>
>たとえば、scanf()で指定文字数まで読み込む場合、
>指定文字数を超えた入力は、キーボードバッファに残っていますよね。
>その存在を知りたいのです。
>
時間がないので・・・
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_getnumberofconsoleinputevents.htm
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_peekconsoleinput.htm


No.16547

ありがとうございます。
投稿者---masay(2004/09/03 16:06:49)


さっそく調べてみます。

どうもありがとうございました。


No.16554

度々申し訳ありません。
投稿者---masay(2004/09/03 17:05:30)


コンソール入力バッファのハンドルというのが良く分からなかったので
まずは以下のようにしてみました。
int count;
if(!GetNumberOfConsoleInputEvents(stdin, &count)){
printf("エラー\n");
}

当然ながら駄目でした。

で、少し調べて以下のように修正しました。
int count;
HANDLE hd;
hd = GetStdHandle(STD_INPUT_HANDLE);
if(!GetNumberOfConsoleInputEvents(hd, &count)){
printf("エラー\n");
}
この場合、エラーにはならないのですが思うような値が返ってきません。
他に何か設定する必要があるのでしょうか?

お忙しいところすみませんが、よろしくお願いいたします。




No.16557

Re:度々申し訳ありません。
投稿者---三毛猫(2004/09/03 17:25:22)


単純にキーバッファが空かどうかを調べるだけでしたら、
_kbhitを使ってみてはいかがでしょう。



No.16559

早速調べてみます!!!。
投稿者---masay(2004/09/03 17:40:46)


>_kbhitを使ってみてはいかがでしょう。
ありがとうございました。




No.16562

上手くいきません…。すみませんがお願いします。
投稿者---masay(2004/09/03 17:54:36)


色々試したのですが…。上手くいきません。

以下、試しているサンプルプログラムです。
最大でmaxSizeバイトの文字をdataに格納します。
maxSize以上の入力があったときは、
fflush(stdin);
で、消去しています。

しかし、その前にmaxSizeを超えての入力があったかどうかを
調べたいのです。

このサンプルでは、_kbhit()でバッファを見ようとしているのですが
いくら入力しても0が返ってきてしまいます。
どうしてでしょうか?

fgets()がいけないのでしょうか…。
よろしくお願いいたします。

void getData(char* data, int maxSize){
int i;
int count;

// 初期化
memset(data, 0, maxSize+1);

// maxSizeを超えての入力は無視することとする
fgets(data, maxSize+1, stdin);

// fgets()は、改行も読み込んでしまうため調整
for(i=0; i<maxSize; i++){
if(data[i] == '\n'){
data[i] = '\0';
break;
}
}

count = _kbhit();
printf("テスト:%d\n",count);

fflush(stdin); // キーボードバッファのクリア
return;
}


No.16560

Re:度々申し訳ありません。
投稿者---Sciggepy(2004/09/03 17:41:30)


マウスイベントなどもカウントしているのではないでしょうか。
PeekConsoleInput関数で、入力の内容を調べる必要があるかもしれません。
INPUT_RECORD構造体のEventTypeがKEY_EVENTの場合、キー入力が存在します。
未処理の入力を同時に削除するには、ReadConsoleInputを使います。