Like Vim:起動すると別の「バッファ」に移動します。 vimが終了すると、コマンドプロンプトの前の内容が表示されます。前のコンソールの内容を "尊重"するC#Windowsコンソールアプリケーションを実行するには?
誰でもC#を使用してこれを行う方法を知っていますか?
ありがとうございました
編集:ユーザーにアプリケーションの出力が表示されなくなりました。それがそれをより良く説明することを望みます。
Like Vim:起動すると別の「バッファ」に移動します。 vimが終了すると、コマンドプロンプトの前の内容が表示されます。前のコンソールの内容を "尊重"するC#Windowsコンソールアプリケーションを実行するには?
誰でもC#を使用してこれを行う方法を知っていますか?
ありがとうございました
編集:ユーザーにアプリケーションの出力が表示されなくなりました。それがそれをより良く説明することを望みます。
私は、mch_init
機能でos_win32.cで見つけることができますVim source code関連ビットを見て、これを考え出しました「だから、単純に(タイトルとアイコンを含む)コンソール情報を保存し、その後、終了時に再びそれを復元し
/* Obtain handles for the standard Console I/O devices */
if (read_cmd_fd == 0)
g_hConIn = GetStdHandle(STD_INPUT_HANDLE);
else
create_conin();
g_hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
#ifdef FEAT_RESTORE_ORIG_SCREEN
/* Save the initial console buffer for later restoration */
SaveConsoleBuffer(&g_cbOrig);
g_attrCurrent = g_attrDefault = g_cbOrig.Info.wAttributes;
#else
/* Get current text attributes */
GetConsoleScreenBufferInfo(g_hConOut, &csbi);
g_attrCurrent = g_attrDefault = csbi.wAttributes;
#endif
if (cterm_normal_fg_color == 0)
cterm_normal_fg_color = (g_attrCurrent & 0xf) + 1;
if (cterm_normal_bg_color == 0)
cterm_normal_bg_color = ((g_attrCurrent >> 4) & 0xf) + 1;
/* set termcap codes to current text attributes */
update_tcap(g_attrCurrent);
GetConsoleCursorInfo(g_hConOut, &g_cci);
GetConsoleMode(g_hConIn, &g_cmodein);
GetConsoleMode(g_hConOut, &g_cmodeout);
#ifdef FEAT_TITLE
SaveConsoleTitleAndIcon();
/*
* Set both the small and big icons of the console window to Vim's icon.
* Note that Vim presently only has one size of icon (32x32), but it
* automatically gets scaled down to 16x16 when setting the small icon.
*/
if (g_fCanChangeIcon)
SetConsoleIcon(g_hWnd, g_hVimIcon, g_hVimIcon);
#endif
コピーしまし、ここで該当ビットを貼り付けました。
残念ながら、Console
クラスはスクリーンバッファの内容にアクセスできないため、これを行うには関連するWin32関数をP/Invokeする必要があります。
別のWin32コンソールは、実際にこれを実装する簡単な方法かもしれないmultiple screen buffersサポート - 単にCreateConsoleScreenBuffer
で新しいものを作成して、現在SetConsoleActiveScreenBuffer
を使用して示したものであることをそのバッファを設定するのではなく、既存のスクリーンバッファをコピーします。再びConsole
クラスは残念ながら複数のスクリーンバッファをサポートしていないので、これを行うにはP/Invokeが必要です。また、Console
クラスは、アプリケーションが起動された時点でアクティブだったスクリーンバッファに常に書き込みます。したがって、アクティブスクリーンバッファをスワップすると、Console
クラスは(表示されなくなった)古いスクリーンバッファに書き込むことになります。これを回避するには、すべてのコンソールアクセスをP /呼び出しする必要があります。Working with Console Screen Buffers in .NETを参照してください。
ありがとう!あなたは正しいです、私はコードを見ていたはずです。私はいくつかのプロジェクトがWindowsの世界でさえまだオープンソースであることを忘れる。 jgauffinの回答により、私はCreateConsoleScreenBufferにバンプしましたが、以前のバッファの状態を保存することは素晴らしい考えです! – robertoprs
バッファがアクティブでないときにクリアされるため、元のバッファ内容の保存が必要になります。 – robertoprs
私はVimが開いているファイルの履歴を記録していると思います。バックアップコピーのように、Vimもそのファイルをバッファリングすると思います。 C#で同じことをするアイデアは、ファイルバッファを実装することです。これは、入力パラメータなどを記録して追跡するためのものです。
もう一つの問題は、Vi(Viのような)がC#で実装する必要があるコマンドモードもあります。これは、C#プログラムで正確に何をしたいのかによって異なります。それはエディタです。どんな場合でも、コマンドと他のモードを区別する必要があります。
ここで説明するようにあなたがコンソールバッファに古いコンテンツを書き込むことによってそれを行うことができます。How can I write fast colored output to Console?
..古いコンテンツを手に入れようとしていますか? –
私はそれが有用であることを知ったので、私はこれをupvoted。私はPInvokeについて知らなかったので、Win32 APIをC#コードから呼び出すことはできませんでした。これにより、CreateConsoleScreenBufferが見つかりました。ジャスティンの答えはより詳細ですが、これは私をブロック解除するのに十分なものでした。 – robertoprs
ここで説明する例は、コマンドラインから起動した場合のC#コンソールアプリケーションの動作を示しています。コンソールアプリケーションを実行して終了すると、前のコマンドラインに戻ります。または私は何かを逃していますか? – Dutts
私は、ポスターは、アプリケーションからの出力がコンソール上になくなってはいけないことを意味しますが、実行前に何があったのかを意味します。 – Matt
@Richard dirやcatのようなアプリケーションは、同じコンソールの "バッファ"上に吐き出されます。 vimのようなアプリケーションでは、コンソールウィンドウに多くのテキストが再描画されますが、閉じた後、ユーザーはvimなど、入力したコマンドを見ることに戻ります。 vimがウィンドウに表示したすべての出力はなくなりました。私が自分自身を正しく説明していないかどうか教えてください。 – robertoprs