5

チームメンバーは、GUI Ogreプロジェクトに次のコードを追加して、コンソールを追加しました(これにより、デバッグ中にcoutを確認できます...

私たちは今、かなり遅れて走っていて、ゲームとのテキストの相互作用が必要です。私はコンソールを作るつもりでしたが、それはおそらく大きな時間の穴です...だから私はちょっと思った!彼が取り付けたコンソールを使ってみませんか!残念ながら、試行したときに入力できなかったため、コンソールにコマンドを送信できませんでした:\

コンソールへの書き込みを有効にする方法はありますか(「a」などのキーを押した場合に彼が行った方法で)コンソールには何も入力されないため、入力を待ってから入力した文字列をフェーズすることはできませんwin32コンソールに)

これが彼のコードです(誰かが大まかな考えを持っている場合はリンクも追加しましたが、彼らはそれについてもう一度読みたいと思っています、彼が従った正確なガイドはわかりませんが、それは非常に似ていました)

void showWin32Console()
{
    static const WORD MAX_CONSOLE_LINES = 1000;
    int hConHandle;
    long lStdHandle;
    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    FILE *fp;

    // allocate a console for this app
    AllocConsole();

    // set the screen buffer to be big enough to let us scroll text
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
    coninfo.dwSize.Y = MAX_CONSOLE_LINES;
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);

    // redirect unbuffered STDOUT to the console
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );

    // redirect unbuffered STDIN to the console
    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "r" );
    *stdin = *fp;
    setvbuf( stdin, NULL, _IONBF, 0 );

    // redirect unbuffered STDERR to the console
    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "w" );
    *stderr = *fp;
    setvbuf( stderr, NULL, _IONBF, 0 );

    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
    // point to console as well
    std::ios::sync_with_stdio();
}
4

1 に答える 1

7

AllocConsole()は、新しいコンソールを提供するだけで、既存のstdin / stdoutを変更しません。したがって、GetStdHandleから取得したハンドルは、以前の値のままです。代わりに、特別なデバイス「CONIN$」/「CONOUT$」を開く必要があります。この新しいコンソールへのstdin/stdoutの再割り当ては、freopenを使用すると、実際にはかなり簡単であることがわかります。

BOOL f = AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);

...そしてpresto、標準の入力または出力へのそれ以降のすべてのアクセスは、新しいコンソールに移動します。

(ちなみに、これは標準の入出力ハンドルに対するWin32のビューを変更しないため、CRTのstdioを使用する代わりにGetStdHandle(STD_INPUT_HANDLE)などを呼び出すプロセスに他のコードがある場合、それらは新しいコンソールに関連しない元の値を引き続き返します。これらも変更する必要がある場合は、CONIN $ / CONOUT $を手動で開き、SetStdHandleを使用して修正する必要があります。)

于 2012-10-31T09:22:16.687 に答える