状況:
- デフォルトの関連ハンドラープログラムに依存することにより、さまざまなファイルタイプ(画像、Word文書など)のプロセスを生成します。これは、特定のファイル名をStartInfo.FileNameとして指定するだけで、そのファイル名の前に実際の実行可能ファイルがないことを意味します。同時に、StartInfo.UseShellExecute=trueを指定します。このようにして、そのファイルタイプに関連付けられたソフトウェアが起動します。
- 私の目標は、そのプロセスが終了したときに通知を受け取ることです。
Process process = new Process();
try
{
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = pFullPath;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardError = true;
bool notReused = process.Start();
}
catch (Win32Exception ex)
バリエーション:
- プロセスの静的Startメソッドはプロセスを返しますが、シナリオでnull/空のオブジェクトを返します。そのため、Processクラスを明示的にインスタンス化し、そのStartInfoプロパティのパラメーターを設定し、最後に非静的Start()を呼び出して、そのProcessオブジェクトインスタンスを保持します。
- StartInfo.UseShellExecute = falseと言うと、実行可能ファイル名を指定しなかったため、例外が発生します。これが、ファイルタイプに関連付けられたプログラムを呼び出す方法のようです。
- 非静的Process.Startにはブール値の戻り値があり、システムがプロセスを再利用したことを示します。私はそれを望んでいませんが、それを避ける方法がわかりません。
- StartInfoのRedirect*ブール値を設定しようとしましたが、InvalidOperationExceptionが再度スローされ、ドキュメントに準拠しています。
「適切な」Processオブジェクトがある場合は、Exitedハンドラーを接続して、EnableRaisingEventsをtrueに設定できます。こんなPITAがこんなにあるのか、驚きと悲しみです。