0

ほぼ同じことを行う多くのバッチファイルを、1つのWPF実行可能ファイルに置き換えています。プログラムを作成しましたが、ディスプレイなどの「コンソール」に問題があります。

プログラム内で、実行可能ファイルを呼び出してタスクを実行します。この実行可能ファイルは、出力メッセージをコンソールに送信します。次のように、これらをディスプレイのような「コンソール」にリダイレクトできます。

Process p = new Process();
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;

p.StartInfo.FileName = MyExecutable;
p.StartInfo.Arguments = MyArguments;
p.Start();

while (!p.StandardOutput.EndOfStream)
{
   string _output = p.StandardOutput.ReadLine();

   // This is my display string ObservableCollection
   _displayString.Add(new DisplayData { _string = _output, _color = System.Windows.Media.Brushes.Black, _fontSize = 12 });

   // This is to redirect to a Console & what I want to get rid of 
   Console.WriteLine(_output);
}

p.WaitForExit();

実行可能ファイルの実行が完了したら、MessageBoxを使用して、実行可能ファイルを再度実行するかどうかをユーザーに尋ねます。問題は、MessageBoxが起動しているときに、ユーザーがウィンドウのような「コンソール」をスクロールして有益な決定を下すことができないことです。これを一時的に回避するには、起動時にコンソールを起動し、これを参照して、実行可能ファイルを実行しているプロセスからの出力ストリームをコンソールに書き込み、ユーザーが情報をスクロールして決定できるようにします。

リストボックスを使用してテキストブロックのコレクションを表示しています。これを参照してください。私はディスプレイやメッセージボックスを作るために何にも執着していません。

ユーザー入力(MessageBox、直接入力など)を受け取るだけでなく、決定を下す前にデータをスクロールできるようにするディスプレイのような「コンソール」を作成するにはどうすればよいですか?

編集: 私が受け取っているコメントに関しては、私が何を達成しようとしているのかはっきりしていません。実行ごとに異なる引数を使用して実行可能ファイルを複数回実行するバッチファイルがあります。実行可能呼び出しの前と呼び出しの間に多くのセットアップがあります。同様のバッチファイルの多くのフレーバーを、ユーザーが実行時に設定を変更できるドロップダウンメニューに置き換える実行可能ファイルを作成しました。ユーザーが自分の設定を気に入ったら、[スタート]ボタンをクリックすると、セットアップが実行され、質問が表示され、最後に実行可能ファイルが初めて実行されます。

私の問題は、私の内部で呼び出された実行可能ファイルの実行が完了したときに、ユーザーがさまざまな理由でそれを再度実行するかどうかを決定する必要があることです。ユーザーに「再実行-'はい'または'いいえ'?」というプロンプトを表示する必要がありますが、そこで問題が発生します。メッセージボックスでは、進行状況ウィンドウをスクロールできません。モードレスダイアログボックスを試しましたが、Show()を使用するとプログラムが続行され、ShowDialog()はMessageBoxと同じ問題です。

これを行う方法についての提案をいただければ幸いです。

4

1 に答える 1

0

Windows を使用していますが、DOS パラダイムを使用しようとしています。Windows はイベント ベースのシステムです。「イベント ハンドラ」を記述する必要がありますが、すべてのコードを 1 つの関数に入れる必要はありません。

ただし、モードレス(「ウィンドウをブロックしていない」を参照)でモーダル(「コードをブロックしている」を参照)ダイアログを表示できるトリックがあります。これを WPF で実装する方法はわかりませんが、ウィンドウを再度有効にすることをお勧めします (ダイアログの親として機能します)。ダイアログイベントハンドラーでこれを行う必要があります(WM_INITDIALOG同等ですか?)。

NULLまた、(WinAPI では) ダイアログを親ウィンドウとして実行することもできます。

于 2013-02-23T06:47:00.293 に答える