2

GitHub

これは、ncurses スタイルのキー押下を処理するために私が思いつくことができる最善のものです (実際には、さまざまな理由で ncurses の代替案を書いています)。

このコードで作成されたサンプル アプリは、ユーザーに「Escape を押して終了する」ようにアドバイスします。実際には、エスケープ + エスケープまたはエスケープ + 矢印キーが必要です。これを修正したいと思います。

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

char *get_key() {
    char c = getchar();

    switch(c) {
        case 'a': return "a";
        case 'b': return "b";
        case 'c': return "c";

        ...

        case '\x1b':
            c = getchar();
            switch(c) {
                case '[':
                    c = getchar();
                    switch(c) {
                        case 'A': return "up";
                        case 'B': return "down";
                        case 'C': return "right";
                        case 'D': return "left";
                    }
                case '\x1b': return "escape";
            }

        default: return "unknown";
    }
4

3 に答える 3

2

ステップ 1. リサーチ。

http://en.wikipedia.org/wiki/Escape_sequence

エスケープ シーケンスを送信する Esc キーとその他のキーの両方がアプリケーションにとって意味があると想定されている場合、端末または端末エミュレータが使用されていると、あいまいさが生じます。特に、アプリケーションが ASCII エスケープ文字を受け取った場合、その文字がユーザーが Esc キーを押した結果なのか、それともエスケープ シーケンスの最初の文字 (矢印キーを押した結果など) なのかが明確ではありません。 . あいまいさを解決する従来の方法は、エスケープ文字の直後に別の文字が続くかどうかを観察することです。そうでない場合は、エスケープ シーケンスの一部ではないと見なされます。このヒューリスティックは、状況によっては失敗する可能性がありますが、実際には、特に最新の通信速度が高速な場合は、かなりうまく機能します。

ステップ 2. OS の入力バッファーで待機している別の文字があるかどうかを確認する方法を理解します。バッファにすでに文字がある場合。それはエスケープシーケンスでした。入力バッファが空の場合はエスケープです。

OSについて言及していないため、これをどのように行うことができるかは明確ではありません。

Windows: sys/select.h および termios.h で定義されている機能に相当する Windows は何ですか?

Linux: http://linux.die.net/man/3/termios

于 2011-07-14T10:22:42.947 に答える
0

VMIN/の脆弱なタイミング メカニズムに依存するよりもVTIME、タイミング ロジックを純粋なユーザーランドに移動することをお勧めします。これと他の多くのケースを処理するライブラリを作成しました。

http://www.leonerd.org.uk/code/libtermkey/

Escape と矢印キーを区別するだけでなく、最新の端末が使用し始めている変更された矢印キーや変更された Unicode などを処理したり、ブロッキングと非ブロッキングの両方の使用をサポートしたり、その他多くのことをサポートしたりできます。実際、キープレスを取得してから文字列バッファーにフォーマットすることで、get_key()関数を簡単に実行できます。termkey_waitkey()termkey_strfkey()

于 2012-04-05T13:16:08.227 に答える
-2

バッファといくつかのビットオプションはうまく機能します。

GitHub

于 2011-07-19T00:53:20.010 に答える