2

私は D プログラミング言語をいじっていますが、ユーザーがエンターを押さなくても文字を取得する方法を知りたいと思っています。

私が欲しいものの疑似コードの例:

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 に答える