2014-09-24 49 views
2

我在玩D编程语言,想知道我如何在不需要用户按下输入的情况下抓住一个字符。我想要什么D编程语言 - 输入没有按下输入

伪例如:

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

在C++中我可以使用CONIO.H的“残培()”,但我还没有在这里找到了类似的话。

编辑:我使用的是Windows 7

编辑2:我发现在this forum一个解决方案,我可以改变我自己用的。 module main;

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(++)中,这取决于操作系统(* conio.h *不是标准头文件/库)。那么你在使用哪种操作系统?那么,除非D指定了一个标准的方法来做到这一点,但我怀疑它。 – hyde 2014-09-24 11:40:44

+0

无论如何,大概D有一种使用C库的方法(因为* everything *有一种使用C库的方法)。所以只需使用* conio *。 – hyde 2014-09-24 11:42:06

+0

啊,对不起。我正在使用Windows 7. – Grisungen 2014-09-24 11:42:17

回答

3

您还可以使用各种库。例如,我的terminal.d可以为windows和linux做这个https://github.com/adamdruppe/arsd/blob/master/terminal.d

下面是我那本书的例子文件(请参阅如果你有兴趣我的SO配置文件),演示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!"); 
} 

输入对象做必要的转换到控制台模式,关闭行缓冲的使用并自行清理。一旦你创建了一个,你就有类似于conio的方法,如input.getch()input.kbhit()

我的终端库还提供其他类型的事件,如鼠标输入,如果你想进入更高级的用法。

要编译,只需下载terminal.d并将其添加到您的命令,例如, dmd yourfile.d terminal.d

+0

非常感谢!如果我只能使clear() - 函数现在工作,那么这将是完美:) – Grisungen 2014-09-24 15:11:52

+0

啊,我从来没有实现它!如果你这样做,让我知道一个github拉请求什么的。否则,我可以稍后再研究它,现在一个解决方法可能会像'foreach(i; 0..25)terminal.writeln();' - 一堆空行来推动剩下的东西。 – 2014-09-24 15:18:08