0

この問題を解決できることを願っています。

ボタンを使用してフォームからプロセスを起動し、プロセスが閉じるまで待機してフォームを再開します。問題は、プロセスが実行されているときにフォームをクリックできることですが、プロセスが閉じられるまで何もしません。たとえば、プロセスが実行されているときにボタンをもう一度クリックしてからプロセスを閉じると、実行中にボタンを押したときにプロセスが再び開始されます。

そのため、フォームをクリック可能にしたくありません。

コードは次のとおりです。

private void button1_Click(object sender, EventArgs e)
{
    var something = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "something.exe"
        }
    };

    if (File.Exists("something.exe"))
    {
        something.Start();
        something.WaitForExit();
    }
    else
    {
        MessageBox.Show("Message.", "Title", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

私も試しました:

            this.Enabled = false;
            something.Start();
            something.WaitForExit();
            this.Enabled = true;

しかし、何らかの理由で、プロセスが閉じられるとフォームが最小化されます。

ありがとう。

4

3 に答える 3

2

コードは、WaitForExit() を呼び出すとメイン アプリケーションがブロックされることを意味します。これにより、WM メッセージがアプリケーションのキューに入れられ、メッセージ ポンプが再び CPU を取得すると処理されます。この問題を解決する 1 つの方法は、BackgroundWorker スレッドを使用し、メイン アプリケーションがプロセスを実行している間はブロックしないことです。ワーカー スレッドを開始する直前に、メイン フォームを無効にし、ワーカーの完了したメソッドでメイン フォームを再度有効にします。ワーカースレッドを起動するときは、プロセスが返らないことを考慮してください...これを達成する1つの方法は、妥当な時間でワーカースレッドを起動する前にタイマーを開始し、スレッドが完了する前にそのタイマーが期限切れになる場合です。キャンセルして、UI を再度有効にします。

これは、あなたが達成しようとしているものに似たbackgroundworkerスレッドのドキュメントです: http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

于 2013-04-12T01:17:15.167 に答える
1

プロセスがコンソールを開いて実行しているため、フォームは最小化されています。したがって、コンソールなしでプロセスを実行する必要があります。を参照してくださいProcessStartInfo

private void button1_Click(object sender, EventArgs e)
{
    var something = new Process {
        StartInfo = new ProcessStartInfo {
            FileName = "something.exe",
            CreateNoWindow=true,
            UseShellExecute=false
        }
    };

    if (File.Exists("something.exe")) {
        this.Enabled = false;
        something.Start();
        something.WaitForExit();
        this.Enabled = true;
    } else {
        MessageBox.Show("Message.", "Title", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

フォームは通常どおり無効になり、有効になります。

于 2013-04-12T01:17:26.873 に答える
0

スレッドを使用する場合は、次のようなフォームではなくコントロールを無効にするだけです。

        this.SetControlEnables(false);
        something.Start();
        something.WaitForExit();
        this.SetControlEnables(true);

SetControlEnables は、必要に応じてフォームのすべてのコントロールを有効または無効にします。

于 2013-04-12T01:32:47.370 に答える