4

c/c++ でキー リーダー プログラムを実装しています。私はLinuxを使用しています。バッファリングされていない getchar 関数がキーのデータ値をほとんど返さないことはわかっています。すべての ASCII キー (az、AZ、1-9、句読点、Enter、Tab、および ESC) に対して、getchar() から返される単一の値があります。矢印キーなどの他のキーについては、ESC キーが読み取られますが、getchar() が再度呼び出されると、別の値 (A、B、C、または D) が取得されます。

A = 65

B = 66

上矢印 = 27 91 65

F5 = 27 91 49 53 126

ESC = 27

ここに完全なテーブル

読み取る文字が他にもあるのか、それとも 1 文字だけなのかを確認する方法はありますか? キーが読み取られ、その最初の値が ESC の場合、それが ESC で始まるファンクション キーなのか、それとも ESC キーなのかわかりません。

#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <iostream>
#include <string>
#include <termios.h>
#include <unistd.h>

using namespace std;

int main(int argc, char *argv[]) {

    int ch[5];
    int i;
    struct termios term;

    tcgetattr( STDIN_FILENO, &term );
    term.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &term );

    ch[0] = getchar();

    // If ch[0] = 27 and there is more data in the buffer
    // printf("You pressed a function key");
    // Else
    // printf("You pressed ESC");

    return 0;   

}
4

3 に答える 3

0

最初の ESC 文字を取得した後、待機せずに他の文字を読み取ることができます (たとえば、termios 構造体で c_cc[VMIN] = 0 および c_cc[VTIME] = 0 を設定することにより)。見つかった文字がファンクション キー パターンと一致しなかった場合、読み取った文字をバッファに挿入して読み戻します。次に、次の get で、バッファリングされた文字があればそれを最初に返します。

于 2014-10-15T11:05:13.660 に答える
0

エスケープを取得したときにstdioの非ブロックをマークしてから、可能な限り読み取ることができます。<fcntl.h> を含める必要があります

if (ch[0] == 27) {
    int flags = fcntl(STDIN_FILENO, F_GETFL, 0);
    fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
    for (;;) {
        int c = getchar();
        if (c == EOF)
            break;
        printf("%u ", c);
    }
    fcntl(STDIN_FILENO, F_SETFL, flags);
    puts("\n");
}

使用可能なデータがなくなるまでループが読み取られるため、2 つのキーが連続して続くという問題はまだあります。

于 2013-05-22T13:28:42.093 に答える