0

私は C で小さなプログラムを書いています。いくつかの仮想キー (矢印キー、return、esc) と 'S' キーの状態を処理する必要があるため、GetKeyState を選択しました。問題は、GetKeyState/GetAsyncKeyState が標準入力に迷子の文字を入れるため、getch() を使用して「任意のキーを押してください」というメッセージを表示できないことです。コード例を次に示します。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
enum key{KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_ESC, KEY_RETURN, KEY_S, KEY_NULL};

enum key getInput()
{
    enum key key_pressed=KEY_NULL;

    while(key_pressed==KEY_NULL)
    {
        if(GetKeyState(VK_UP) & 0x8000) key_pressed=KEY_UP;
        if(GetKeyState(VK_DOWN) & 0x8000 ) key_pressed=KEY_DOWN;
        if(GetKeyState(VK_LEFT) & 0x8000) key_pressed=KEY_LEFT;
        if(GetKeyState(VK_RIGHT) & 0x8000) key_pressed=KEY_RIGHT;
        if(GetKeyState(VK_ESCAPE) & 0x8000) key_pressed=KEY_ESC;
        if(GetKeyState(VK_RETURN) & 0x8000) key_pressed=KEY_RETURN;
        if(GetKeyState('S') & 0x8000) key_pressed=KEY_S;
    }
    Sleep(150);
    return key_pressed;
}

int main()
{
    printf("Press a virtual key\n");
    getInput();
    printf("Virtual key pressed. Press Any key to exit.\n");
    getch();    //at this point, the program should wait for a user input.
    return 0;
}

プログラムがgetInput()KEY_RETURN または KEY_S を返す関数から終了すると、次の getch() はバイパスされ、プログラムはそのまま終了します。getInput()関数内または getch() の前にスリープ時間を長くしても、何も解決しません。文字列を入力する必要があり、プログラムが既に入力バッファーに「s」、「esc」、または「enter」を入れていると、面倒です。どうすればこれを解決できますか? 前もって感謝します。

編集:手動の stdin フラッシュ (を使用) を試しましたwhile(getch()!='\n');が、「enter」キーで動作します。「s」キーについてこれを解決する方法をまだ見つけようとしています。また、軽微な誤りを修正しました。

4

0 に答える 0