1

基本的に、コンソール アプリケーションのキー検出機能がありますが、何らかの理由でファンクション キーが検出されません。

これが私のコードです。LinuxでGNUコンパイラを使用しています。どんな助けやアイデアも大歓迎です。

        refresh();
        key = getch();
        switch(key) {
            case KEY_HOME:      key = HOME;   break;
            case KEY_END:       key = END;    break;
            case KEY_UP:        key = UP;     break;
            case KEY_DOWN:      key = DOWN;   break;
            case KEY_LEFT:      key = LEFT;   break;
            case KEY_RIGHT:     key = RIGHT;  break;
            case KEY_NPAGE:     key = PGDN;   break;
            case KEY_PPAGE:     key = PGUP;   break;
            case KEY_DC:        key = DEL;    break;
            case KEY_IC:        key = INSERT; break;
            case KEY_F(1):      key = F(1);   break;
            case KEY_F(2):      key = F(2);   break;
            case KEY_F(3):      key = F(3);   break;
            case KEY_F(4):      key = F(4);   break;
            case KEY_F(5):      key = F(5);   break;
            case KEY_F(6):      key = F(6);   break;
            case KEY_F(7):      key = F(7);   break;
            case KEY_F(8):      key = F(8);   break;
            case KEY_F(9):      key = F(9);   break;
            case KEY_F(10):     key = F(10);  break;
            case KEY_F(11):     key = F(11);  break;
            case KEY_F(12):     key = F(12);  break;
            case KEY_ENTER:     key = ENTER;  break;
            case KEY_BACKSPACE: key = BACKSPACE; break;
            default:
                //key = F(2); //For any function keypress, it jumps to default
                if (NON_ASCII(key) != 0)
                    key = UNKNOWN;
        }    
4

3 に答える 3

2

私は curses の専門家ではありませんが、man ページを少し読んだだけで、次のプログラムにたどり着きました。

#include <curses.h>

int main()
{
    int key;

    initscr(); cbreak(); noecho();

    while (1)
    {

        key = getch();
        printw ("%u\n", key);
    }

    return 0;
}

F キーを押すと、27、79、(80 + N-1) の 3 文字のシーケンスが返されます。ここで、N は F キーの番号です。スイッチは、キーがエスケープ シーケンスであることを認識し、特別に処理する必要があると思います。

編集:そのパターンはF1-F4にのみ当てはまります。F5 で変更します。おそらく、curses の F(n) マクロを組み込みたいと思うでしょう。

于 2010-08-12T15:22:37.547 に答える
0

関数を使用して、端末の「キーパッド」機能を有効にする必要がある場合がありkeypadます。キーパッド(3x) マニュアルページから:

int keypad(WINDOW *win, bool bf);

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

于 2013-12-24T01:35:29.137 に答える
0

個人的には同じ問題を抱えています。

F(n) マクロを char 型にキャストすると、魔法のように問題が解決されました。

cmd = getch();
    switch(cmd){
        case 'r':
            addch('r');
            break;
        case 'w':
            addch('x');
            break;
        default:
            if(cmd == (char)KEY_F(2)){ endwin(); exit(0); }
    }

など。F2 から F10 と F12 までを担当。F の 1、10、および 11 は、私の xterm に適切な言葉がないため、「占有」されています。(F1 はヘルプ ウィンドウを開き、F11 はフルスクリーン モードを切り替えます。) 繰り返しますが、これが機能する理由を推測できないほど強調しきれません。

于 2012-08-09T07:49:11.713 に答える