46

getch()矢印キーのスキャンに使用するプログラムを作成しています。これまでの私のコードは次のとおりです。

switch(getch()) {
    case 65:    // key up
        break;
    case 66:    // key down
        break;
    case 67:    // key right
        break;
    case 68:    // key left
        break;
}

問題は、、を押す'A''B''C'などの10進コードであるため'D'、コードも実行されることです。65'A'

他の人に電話せずに矢印キーを確認する方法はありますか?

ありがとう!

4

11 に答える 11

82

1つの矢印キーgetchを押すと、3つの値がバッファーにプッシュされます。

  • '\033'
  • '['
  • 'A'、、または'B'_'C''D'

したがって、コードは次のようになります。

if (getch() == '\033') { // if the first value is esc
    getch(); // skip the [
    switch(getch()) { // the real value
        case 'A':
            // code for arrow up
            break;
        case 'B':
            // code for arrow down
            break;
        case 'C':
            // code for arrow right
            break;
        case 'D':
            // code for arrow left
            break;
    }
}
于 2012-07-11T12:26:29.037 に答える
24

fatch()関数は、FatalErrorのコメントに記載されているように、矢印キー(およびその他の特殊キー)に対して2つのキーコードを返します。最初に0(0x00)または224(0xE0)のいずれかを返し、次に押されたキーを識別するコードを返します。

矢印キーの場合、最初に224を返し、次に72(上)、80(下)、75(左)、77(右)を返します。NumLockの矢印キー(NumLockがオフの状態)が押されると、getch()は224ではなく0を最初に返します。

getch()は標準化されておらず、これらのコードはコンパイラーごとに異なる可能性があることに注意してください。これらのコードは、Windows上のMinGWおよびVisualC++によって返されます。

さまざまなキーに対するgetch()のアクションを確認するための便利なプログラムは次のとおりです。

#include <stdio.h>
#include <conio.h>

int main ()
{
    int ch;

    while ((ch = _getch()) != 27) /* 27 = Esc key */
    {
        printf("%d", ch);
        if (ch == 0 || ch == 224)
            printf (", %d", _getch ()); 
        printf("\n");
    }

    printf("ESC %d\n", ch);

    return (0);
}

これは、MinGWおよびVisualC++で機能します。これらのコンパイラは、getch()の代わりに_getch()という名前を使用して、それが非標準関数であることを示します。

したがって、次のようなことを行うことができます。

ch = _getch ();
if (ch == 0 || ch == 224)
{
    switch (_getch ())
    {
        case 72:
            /* Code for up arrow handling */
            break;

        case 80:
            /* Code for down arrow handling */
            break;

        /* ... etc ... */
    }
}
于 2012-05-06T18:59:44.230 に答える
6

それで、たくさんの苦労の後で、私はこの厄介な問題を奇跡的に解決しました!Linuxターミナルを模倣しようとして、上矢印キーまたは下矢印キーを押してアクセスできるコマンド履歴を保持している部分でスタックしました。ncurses libは、理解するのが非常に難しく、学ぶのが遅いことがわかりました。

char ch = 0, k = 0;
while(1)
{
  ch = getch();
  if(ch == 27)                  // if ch is the escape sequence with num code 27, k turns 1 to signal the next
    k = 1;
  if(ch == 91 && k == 1)       // if the previous char was 27, and the current 91, k turns 2 for further use
    k = 2;
  if(ch == 65 && k == 2)       // finally, if the last char of the sequence matches, you've got a key !
    printf("You pressed the up arrow key !!\n");
  if(ch == 66 && k == 2)                             
    printf("You pressed the down arrow key !!\n");
  if(ch != 27 && ch != 91)      // if ch isn't either of the two, the key pressed isn't up/down so reset k
    k = 0;
  printf("%c - %d", ch, ch);    // prints out the char and it's int code

それはちょっと大胆ですが、それは多くを説明します。幸運を !

于 2013-02-14T04:00:01.857 に答える
3

これkeypadにより、ユーザーの端末のキーボードで、ファンクションキーを単一の値として解釈できるようになります(つまり、エスケープシーケンスはありません)。

マニュアルページに記載されているように:

キーパッドオプションは、ユーザーの端末のキーパッドを有効にします。有効になっている場合(bfがTRUEの場合)、ユーザーはファンクションキー(矢印キーなど)を押すことができ、wgetchはKEY_LEFTのようにファンクションキーを表す単一の値を返します。無効にした場合(bfがFALSEの場合)、cursesはファンクションキーを特別に処理せず、プログラムはエスケープシーケンス自体を解釈する必要があります。端末のキーパッドをオン(送信する)およびオフ(ローカルで機能する)にできる場合、このオプションをオンにすると、wgetchが呼び出されたときに端末のキーパッドがオンになります。キーパッドのデフォルト値はfalseです。

于 2015-12-14T00:12:47.250 に答える
2

実際、矢印キーを読み取るには、スキャンコードを読み取る必要があります。以下は、矢印キーを押すことによって生成されるスキャンコードです(キーリリースではありません)

numLockがオフの場合

  • 左E04B
  • 右E04D
  • E048まで
  • ダウンE050

Num Lockがオンの場合、これらのキーの前にE02Aが付きます。

  • バイトE0は-32です
  • バイト48は72UPです
  • バイト50は80ダウンです

    user_var=getch();
    if(user_var == -32)
    {
        user_var=getch();
        switch(user_var)
        {
        case 72:
            cur_sel--;
            if (cur_sel==0)
                cur_sel=4;
            break;
        case 80:
            cur_sel++;
            if(cur_sel==5)
                cur_sel=1;
            break;
    
        }
    }
    

上記のコードでは、プログラマーが4行だけを移動したいと想定しています。

于 2015-04-01T11:54:03.737 に答える
1

ncurses作業コードとncursesの初期化で 使用するソリューションについては、 getchar()が上下の矢印キーに対して同じ値(27)を返すことを参照してください。

于 2017-09-07T13:10:59.250 に答える
1

これを試してみませんか?

void CheckKey(void) {
int key;
if (kbhit()) {
    key=getch();
    if (key == 224) {
        do {
            key=getch();
        } while(key==224);
        switch (key) {
            case 72:
                printf("up");
                break;
            case 75:
                printf("left");
                break;
            case 77:
                printf("right");
                break;
            case 80:
                printf("down");
                break;
        }
    }
    printf("%d\n",key);
}

int main() {
    while (1) {
        if (kbhit()) {
            CheckKey();
        }
    }
}

(224がある理由がわからない場合は、次のコードを実行してみてください:)

#include <stdio.h>
#include <conio.h>

int main() {
    while (1) {
        if (kbhit()) {
            printf("%d\n",getch());
        }
    }
}

でもなぜ224なのかわかりません。理由がわかったらコメントを書いていただけませんか?

于 2018-03-21T13:45:23.117 に答える
0

getchを使用して矢印コードを取得する関数を作成しました。これは簡単な「n」ダーティソリューションですが、関数は矢印キーに応じてASCIIコードを返します:UP:-10 DOWN:-11 RIGHT:-12 LEFT:-13

また、この機能により、ESCAPEタッチと矢印キーを区別することができます。ただし、ESCキーをアクティブにするには、ESCを2回押す必要があります。

ここにコード:

char getch_hotkey_upgrade(void)
{
  char ch = 0,ch_test[3] = {0,0,0};

    ch_test[0]=getch();

    if(ch_test[0] == 27)
    {
        ch_test[1]=getch();

        if (ch_test[1]== 91)
        {
            ch_test[2]=getch();

            switch(ch_test[2])
            {
            case 'A':
                //printf("You pressed the up arrow key !!\n");
                //ch = -10;
                ch = -10;
                break;
            case 'B':
                //printf("You pressed the down arrow key !!\n");
                ch = -11;
                break;
            case 'C':
                //printf("You pressed the right arrow key !!\n");
                ch = -12;
                break;
            case 'D':
                //printf("You pressed the left arrow key !!\n");
                ch = -13;
                break;
            }
        }
        else
         ch = ch_test [1];
    }
    else
        ch = ch_test [0];
  return ch;
}
于 2017-10-14T22:27:57.613 に答える
0

私は単なる初心者ですが、作成しました。作成しchar(for example "b")ますb = _getch();conio.hライブラリのコマンドです) 。

If (b == -32)
b = _getch();

そして、キーをチェックしてください(72上、80下、77右、75左)

于 2018-02-21T23:43:33.260 に答える
0
    void input_from_key_board(int &ri, int &ci)
{
    char ch = 'x';
    if (_kbhit())
    {
        ch = _getch();
        if (ch == -32)
        {
            ch = _getch();
            switch (ch)
            {
            case 72: { ri--; break; }
            case 80: { ri++; break; }
            case 77: { ci++; break; }
            case 75: { ci--; break; }

            }
        }
        else if (ch == '\r'){ gotoRowCol(ri++, ci -= ci); }
        else if (ch == '\t'){ gotoRowCol(ri, ci += 5); }
        else if (ch == 27) { system("ipconfig"); }
        else if (ch == 8){ cout << " "; gotoRowCol(ri, --ci); if (ci <= 0)gotoRowCol(ri--, ci); }
        else { cout << ch; gotoRowCol(ri, ci++); }
        gotoRowCol(ri, ci);
    }
}
于 2018-05-02T17:10:38.557 に答える
-1

これを試して...

私はCode::Blocksを使用してWindows7を使用しています

while (true)
{
    char input;
    input = getch();

    switch(input)
    {
    case -32: //This value is returned by all arrow key. So, we don't want to do something.
        break;
    case 72:
        printf("up");
        break;
    case 75:
        printf("left");
        break;
    case 77:
        printf("right");
        break;
    case 80:
        printf("down");
        break;
    default:
        printf("INVALID INPUT!");
        break;
    }
}
于 2019-06-03T09:24:53.770 に答える