2

我正在玩 D 编程语言,想知道如何在不要求用户按 Enter 的情况下获取字符。

我想要的伪代码示例:

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

在 C++ 中,我可以使用 conio.h 的“getch()”,但我还没有在这里找到类似的东西。

编辑:我使用的是 Windows 7。

编辑 2:我在这个论坛上找到了一个解决方案,我可以更改它以供自己使用。主模块;

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);
    }
}
4

1 回答 1

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!");
}

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

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

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

于 2014-09-24T13:45:24.490 回答