1

私はjavaとphp(ゼロから)でいくつかのANSIのもの(色など)をいじっており、基本的にキーが押されるのを待つ方法を見つけようとしています。メインイベントループの最後に次の擬似コードのようなものが必要です。

If (KeyPressed)
Begin
    var event = new KeyboardEvent();
        event.Key = ReadKey();
    this.BubbleEvent(event);
End

しかし、ユーザーがEnterキーを押した後にのみ、STDINでキーを押すことができるようになるため、過去2日間に試したすべてが失敗します。

どの言語で答えるかはそれほど重要ではありませんがjava、、、、php昔ながらの、cまたはc#最も優れていると思います。これらの4つの言語すべてに移植する必要があるため、本当に洗練されたライブラリを使用することはできません。telnetまたは接続を介して作業しsshますが、これまでの私の調査では、ローカルマシンで作業している場合を除いて、それは不可能であることが示されています。

私が間違っていることを証明してください。

4

2 に答える 2

2

curses 関数cbreak(3)は、行バッファリングと消去/キル処理を無効にします。stty(1)本当に必要な場合は、これを自分で行うことができます。

プログラムが終了し、端末がcbreakモードのままになった場合、通常はstty saneまたはresetを使用して、端末を適切な状態に戻すことができます。

Perl 内から、Term::ReadKeyまたはCursesモジュールを使用してターミナルを操作できます。詳細については、Term::ReadKey(3pm)またはのCurses(3pm)マンページを参照してください。

C 内からioctl(2)、端末デバイスで呼び出しを使用して cbreak モードをオンにするか、curses を使用できます。詳細については、ncurses(3)マンページを参照してください。

于 2010-07-23T05:45:38.350 に答える
1

これは古いスレッドですが、他のどこにも適切な答えが見つかりませんでした。それで、私の会社の上級プログラマーの助けを借りて、私はこれを思いつきました:

private void waitKeypress() throws IOException
{
    System.in.read();
    while ( System.in.available() > 0 ) 
    {
        System.in.read();
    }
}

利用可能な限り多くの入力を読み取る部分は、複数回使用すると「System.in.read()」だけでは常に待機しないという問題を解決しました。

私にとってはこれでうまくいきます。次のように使用します。

doSomething();
waitKeypress();
doNextThing();

それが役に立てば幸い。

よろしく、ラルフ

于 2011-10-14T11:48:08.837 に答える