質問
基本的に、コンソールアプリケーションの重要な検出がありますが、何らかの理由で機能キーが検出されません。
これが私のコードです、私は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;
}
解決
私は呪いの専門家ではありませんが、少し読んだ男のページがこのプログラムをネットしました:
#include <curses.h>
int main()
{
int key;
initscr(); cbreak(); noecho();
while (1)
{
key = getch();
printw ("%u\n", key);
}
return 0;
}
Fキーを押すと、3文字のシーケンス:27、79、(80 + n-1)を取得します。ここで、nはFキーの数です。あなたのスイッチは、キーがエスケープシーケンスであることを認識し、それを特別に処理する必要があると思います。
編集: そのパターンは、F1-F4に対してのみ保持されます。 F5はそれを変更します。おそらく、呪いからf(n)マクロを組み込みたいと思うでしょう。
他のヒント
個人的にも同じ問題があります。
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はフルスクリーンモードなどを切り替えます。)繰り返しますが、それがなぜ機能するのか推測し始めることができないほど強調できません。
あなたは、 keypad
働き。キーパッド(3x)マニュアルページから:
int keypad(WINDOW *win, bool bf);
キーパッド オプションユーザーの端末のキーパッドを有効にします。有効な場合(bf は 本当です)、ユーザーは関数キー(矢印キーなど)を押すことができます wgetch のように、機能キーを表す単一の値を返します key_left. 。無効の場合(bf は 偽), 呪い 機能キーを特別に扱うことはなく、プログラムはエスケープシーケンス自体を解釈する必要があります。ターミナルのキーパッドをオンにする(送信するように作られている)とオフ(ローカルで作業するために作られている)場合、このオプションをオンにすると、端子キーパッドがオンになります。 wgetch 呼ばれています。キーパッドのデフォルト値はfalseです。