2014-09-24 5 views
2

나는 D 프로그래밍 언어를 가지고 놀고 있는데, 이 사용자가 enter를 누르지 않고도 어떻게 잡을 수 있는지 궁금합니다. 내가 원하는 것을D 프로그래밍 언어 - 누르지 않고 입력

의사 코드 예 :

while(true){ 
    if(userHasPressedChar()){ 
     writeln(getChar()); 
    } 
} 

C에서 + +를 내가 conio.h와의 "() getch"를 사용할 수 있습니다,하지만 난 여기 유사한 아무것도 찾을 못하고있다.

편집 : 윈도우 7

편집 2를 사용하고 있습니다 : 나는 내 자신의 사용을 위해 변경할 수 this forum에서 솔루션을 발견했다. 모듈 메인;

import std.stdio; 
import core.sys.windows.windows; 


void main() { 
    auto hCon = GetStdHandle(STD_INPUT_HANDLE); 
    FlushConsoleInputBuffer(hCon); 
    for(;;) { // in default console mode, ctrl-C will terminate 
     INPUT_RECORD inrec; 
     DWORD numread; 
     while(inrec.EventType != KEY_EVENT) { 
      WaitForSingleObject(hCon, INFINITE); 
      ReadConsoleInputW(hCon, &inrec, 1, &numread); 
     } 
     auto keyEvent = inrec.KeyEvent; 
     writefln("VK: %x \tChar: %x \tState: %x", 
       keyEvent.wVirtualKeyCode, 
       keyEvent.UnicodeChar, 
       keyEvent.dwControlKeyState); 
    } 
} 
+1

C (++)에서는 OS에 따라 다릅니다 (* conio.h *는 표준 헤더/라이브러리가 아닙니다). 그래서 어떤 OS를 사용하고 있습니까? 글쎄, D가 이것을하는 표준 방법을 지정하지 않는 한, 나는 그것을 의심한다. – hyde

+0

어쨌든, D에는 아마도 C 라이브러리를 사용할 수있는 방법이 있습니다 (* 모든 라이브러리에는 C 라이브러리를 사용할 수있는 방법이 있기 때문입니다). 따라서 * conio *를 사용하십시오. – hyde

+0

아, 죄송합니다. Windows 7을 사용하고 있습니다. – Grisungen

답변

3

다양한 라이브러리를 사용할 수도 있습니다. 예를 들어, 내 terminal.d는 Windows 및 Linux 용으로 https://github.com/adamdruppe/arsd/blob/master/terminal.d을 수행 할 수 있습니다. 여기

는이 입력 객체가 라인 버퍼링을 해제 콘솔 모드로 필요한 변환을 수행 http://arsdnet.net/dcode/book/chapter_12/07/input.d

import terminal; 

void main() { 
    auto terminal = Terminal(ConsoleOutputType.linear); 
    auto input = RealTimeConsoleInput(&terminal, ConsoleInputFlags.raw); 
    terminal.writeln("Press any key to exit"); 
    auto ch = input.getch(); 
    terminal.writeln("Bye!"); 
} 

사용을 보여줍니다 (당신이 관심이 있다면 내 SO 프로필을보고) 내 책에 들어있는 예제 파일입니다 그 자체 후에 청소한다. 하나를 만들면 conio와 비슷하게 input.getch()input.kbhit()과 같은 메서드를 사용할 수 있습니다.

내 터미널 라이브러리는 고급 사용법을 익숙하게하려면 마우스 입력과 같은 다른 이벤트 유형도 제공합니다.

컴파일하려면 terminal.d를 다운로드하여 명령에 추가하십시오. dmd yourfile.d terminal.d.

+0

고마워요! 내가 clear() - 함수 작업을 할 수 있다면 지금은 완벽 할 것이다 :) – Grisungen

+0

아아 이크 스, 나는 그것을 구현하지 않았다! 네가 그렇게한다면, github pull 요청이나 뭐라고 알려줘. 그렇지 않으면 나중에 살펴볼 수 있으며, 임시 해결책은 아마도 foreach (i; 0 .. 25) terminal.writeln();과 같이 될 것입니다. 나머지 부분을 밀어 넣기위한 빈 줄이 있습니다. –

관련 문제