2010-08-12 5 views
1

기본적으로 콘솔 응용 프로그램의 키 감지 기능이 있습니다. 기능 키가 감지되지 않습니다.GNU 컴파일러 KEY_F가 기능 키를 감지하지 못합니다.

여기 내 코드입니다, 리눅스에서 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; 
     }  
+0

여기서 'KEY_x'값은 # 어디에 정의되어 있습니까? 'KEY_F (num) '가 맞습니까? 기능 키를 누를 때 무슨 일이 일어나는가?'key '는 어떤 가치가 있는가? 자, 이건 꽤 표준 디버깅입니다. – Konrad

+0

이 코드는 (n) 저주입니까? 기능 키를 누를 때'key' 값을 검사하여 얻고 자하는 값과 비교하여 디버깅을 시작해야한다고 생각합니다. 나는 당신이 의미한다고 생각하는 것을 의미하지 않는 기능 키를 가진 이상한 것을 가지고있는 저주를 기억하는 것 같다. –

+0

콘라드, 너의 오만함이 나를 도와주지 않는다. 이미 언급 한 모든 작업을 수행했습니다. 예 R ()입니다. 어떤 이유로 '~'을 매번 반환합니다. 출력 값을 출력하기 위해 별도의 작은 앱을 만들었습니다. 각 기능 키마다 126을 반환합니다. 나는이 시점에서 꽤 혼란 스럽다. – Marcin

답변

2

나는 저주 전문가가 아니지만, man 페이지를 읽고 약간의 나에게이 프로그램을 거뒀다 :

#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가 그것을 바꾼다. curses의 F (n) 매크로를 통합하려고합니다.

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은 전체 화면 모드를 전환합니다.) 다시 강조하지만, 나는 그것이 왜 작동하는지 추측하기 시작할 수는 없다.

1

keypad 기능을 사용하여 터미널의 "키패드"기능을 활성화해야 할 수 있습니다. 키패드 (3 배) 매뉴얼 페이지에서 :

int keypad(WINDOW *win, bool bf);

키패드 옵션은 사용자의 단말기의 키패드를 할 수 있습니다. 활성화 (BFTRUE되어 있으면), 사용자 KEY_LEFT 형태와 기능 키를 나타내는 단일 값을 반환 함수 (예컨대 화살표 키)를 키 wgetch을 누를 수있다. 비활성화 된 경우 (bfFALSE) curses은 키를 특별히 처리하지 않으며 프로그램이 자체적으로 이스케이프 시퀀스를 해석해야합니다. 터미널의 키패드를 켜고 (전송할 때) (로컬로 작동하도록)을 해제 한 경우이 옵션을 켜면 wgetch을 호출하면 터미널 키패드가 켜져 이됩니다. 키패드의 기본값은 false입니다.

관련 문제