- PR -

Process.Startでコンソールアプリを起動する際、立ち上がるDOS窓のウィンドウサイズやフォントを変えたい

1
投稿者投稿内容
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-06-20 12:48
こんにちは〜。

早速本題なのですが、
Windowsアプリケーションからあるコンソールアプリケーションを起動したいのですが、
そのコンソールアプリが下記のような感じでバックスペースを使って
同じところに処理の進捗を表示しています。

コード:

static void Main(string[] args)
{
Console.Write("処理中です... ");
for(int i = 0; i < 100; i++)
{
string s = string.Format("{0}%", i + 1);
Console.Write(s);
System.Threading.Thread.Sleep(50);
for(int j = 0; j < s.Length; j++)
{
Console.Write("\b");
}
}
}



過去スレにDOS窓を非表示にする方法は見つけたのですが、
今回はこの進捗が見えるようにしたく、まぁ何もしなければ普通にDOS窓が立ち上がるのですが、
ちょっとかっこわるいなぁと(^^;

進捗が見えないよりは見えた方が良いので、方法がなければこのままでもいっか、とは思ってるのですが、
このDOS窓の大きさやフォントを変えたりすることってできるのでしょうか?

あるいはこのようにバックスペースを使って同じところに処理の進捗を表示する
コンソールアプリの標準出力をリアルタイムで拾って
Windowsフォーム上のどこかに表示する方法でも良いのですが…

ちなみにWindowsアプリ側の言語はVB2005ですが、もしサンプルコードなどがあればC#でも構いません。
もしご存知でしたらご教授ください。よろしくお願いします。m(_ _)m

[ メッセージ編集済み 編集者: ぼのぼの 編集日時 2006-06-20 13:03 ]
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-06-20 14:48
Windowsフォームに表示する方法ですが、以下のコードで実現できると思います。
コード:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "***.exe";
p.StartInfo.CreateNoWindow = true;
p.Start();
string line;
do
{
    line = p.StandardOutput.ReadLine();
    /* {フォームに表示する処理} */
    Application.DoEvents();
} while((!p.HasExited) || (line != null));


HasExitedプロパティの代わりにWaitForExit(int32)メソッドでも可能です。
その場合でも、whileの位置は変えないでください。
理由はStandardOutputプロパティのヘルプを読んでいただければ分かると思います。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-06-20 15:17
うにくまさん、ご回答ありがとうございます。

早速試してみたのですが、これだと「リアルタイムでは」拾えないみたいです。
ループは1回しか回らず、最初のReadLine()で
"処理中です... 1%\b\b2%\b\b3%\b\b4%\b\b{以下同様に100%まで}"
みたいな文字列がいっぺんに返ってきてしまいます(−公−

[追記]
ん?よく考えたらReadLine()を使わなきゃいいのか…
Read()を使ってちょっと試して見ます。

[ メッセージ編集済み 編集者: ぼのぼの 編集日時 2006-06-20 15:29 ]
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-06-20 15:43
Read()を使ったらできました!
ありがとうございました。m(_ _)m

コード:

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "***.exe";
p.StartInfo.CreateNoWindow = true;
p.Start();
int chr;
string s = "";
do
{
    chr = p.StandardOutput.Read();
    if(chr != -1) 
    {
        if(chr == 8) s = s.Substring(0, s.Length - 1);
        else s += Convert.ToChar(chr).ToString();
        this.label1.Text = s;
        this.Update();
        Application.DoEvents();
    }
} while(!p.HasExited);
this.label1.Text = "";

うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-06-20 16:39
コンソールアプリケーションの修正が可能ならば、以下の方法もあります。
コード:
for(int i = 0; i < 100; i++)
{
    string s = string.Format("処理中です...{0}%", i + 1);
    Console.Write(s);
    System.Threading.Thread.Sleep(50);
    Console.Write("\r");
}

ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-06-20 16:50
おお〜、なるほど!
しかし残念ながら、コンソールアプリのコードはあくまでサンプルで、
実際はフリーソフトなんです(^^;

#ちなみに、勉強用に作った個人で使うためのツールだったりしますw
1

スキルアップ/キャリアアップ(JOB@IT)