2010-07-23 7 views
1

저는 Java와 PHP에서 (색상과 같은) ANSI를 사용하고 있습니다. 처음부터 키를 기다리는 방법을 찾으려고합니다. 실패 키 입력은 STDIN에 사용할 수있게 때문에 나는 지난 몇 일 동안 노력했습니다대기중인 (원격) 터미널 세션에서 키를 누르는 방법이 있습니까?

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

을하지만 모든 : 내 메인 이벤트 루프의 끝에 다음 의사 코드 같은 것을 가지고 싶습니다 사용자가 엔터를 누른 후

그것은별로 중요하지 않습니다 당신이 대답하지만, java, php는, 보통 오래된 c 또는 c#이 좋은 것, 그리고 그 모든 4 개의 포트 그것을 필요로하기 때문에 내가 어떤 정말 깔끔한 라이브러리 물건을 사용할 수 없습니다 어떤 언어 언어 ... telnet 또는 ssh 연결을 통해 작동해야하지만 지금까지의 내 연구는 로컬 시스템에서 작업하지 않는 한 불가능하다는 것을 제시합니다.

잘못 알려주세요.

답변

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) 맨 페이지를 참조하십시오.

+0

감사합니다. 나는 주말에 이것을 확실히 체크 할 것이다! – Kris

+0

curses는 lib에 의존하고 있기 때문에, 나는 curses가 소스를 읽는 것을 어떻게하는지 알 수 없다. (그리고 나는 이것을 배우기 위해 C++을 배우고 싶지 않다.) – Kris

1

알다시피, 이것은 오래된 스레드이지만, 다른 곳에서는 적절한 대답을 찾을 수 없습니다. 내 회사의 수석 프로그래머의 도움으로 그래서 나는이 함께했다 :

private void waitKeypress() throws IOException 
{ 
    System.in.read(); 
    while (System.in.available() > 0) 
    { 
     System.in.read(); 
    } 
} 
볼 수만큼 입력을 읽는 부분은 내 문제를 해결

이 여러 번 사용할 때, "System.in.read() "혼자 항상 기다리지는 않습니다. 나이 들어

트릭을 수행,이처럼 사용

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

는 도움이되기를 바랍니다.

친절한 답변, 랄프

+0

이것은 내 문제를 해결하지는 않지만 (나는 키를 누를 때까지 기다리는 것을 원하지 않는다.) 이것은이 스레드를 방문하는 다른 누군가에게 유용 할 수있다. . – Kris

관련 문제