次のコードは、フォームが無効になっているときに「ドラッグ」された場合(メモ帳が終了した場合)、フォームが新しい位置にあることを除いて、期待どおりに機能します。どうすればそれを防ぐことができますか?
Enabled = false;
Process p = Process.Start("notepad");
p.WaitForExit();
Enabled = true;
さて、私は問題を再現します。問題は、UIスレッドでWaitForExit()を呼び出していることです。これにより、メッセージループのポンピングと入力イベントの処理が停止します。それらはメッセージキューに入れられます。プロセスが終了するとすぐに、メソッドが戻り、UIスレッドがメッセージのポンピングを再開します。そして、ウィンドウが無効ではなくなったためにバッファリングされたマウスメッセージを検索して実行します。
UIスレッドで実行されるコードの一般的なルールは、ブロックしないことです。多くのことがうまくいかないでしょう、これはほんの一例です。Processクラスを使用すると簡単に実行でき、プロセスが終了したときに発生するイベントがあります。したがって、WaitForExit()を使用する必要はありません。コードを次のようにします。
this.Enabled = false;
var prc = System.Diagnostics.Process.Start("notepad.exe");
prc.EnableRaisingEvents = true;
prc.SynchronizingObject = this;
prc.Exited += delegate {
this.Enabled = true;
this.Activate();
};
ウィンドウをフォアグラウンドに戻すには、Activate()呼び出しが必要であることに注意してください。これは常に機能するとは限りません。
showDialogで呼び出される2番目のフォームからProcessstartを実行してみることができます。
Form2 frm2 =new Form2();
frm2.ShowDialog();
Form2 Loadイベントに、
Process p = Process.Start("notepad");
p.WaitForExit();
this.DialogResult=DialogResult.OK;
完全ではない可能性が高いすべての構文をチェックする必要があります。
Form2.Visibleをfalseに設定することもできるので、ユーザーには表示されません。
HomeToastが提案したように編集します。フォームを非表示にしてもかまわない限り、これは非常にうまく機能します。フォームを表示したままにしておきたい場合は、最初の提案を使用します。
このオプションでは、メインフォームをVisible = falseにします。代わりに、Enable = falseの場合、ドラッグするフォームがない場合、ユーザーはそれをドラッグできません。
this.Visible = false;
Process p = Process.Start("notepad");
p.WaitForExit();
this.Visible = true;