Process.Start(string Filename) を使用してファイルを開くアプリケーションがあります。このメソッドのオーバーロードにより、システムはファイル名拡張子に基づいて適切なアプリケーションを呼び出します。私の場合、通常、それは WORD、PPT、PDF、JPG などになります。ある種の表示可能なドキュメントです。最終的には、プロセスを起動する必要があり、その後アプリケーションで MainWindowHandle 値を使用して何かを行う必要があります。
Process.Start(string filename) が異なる方法を返す原因となる少なくとも3つの異なるケースを見つけました...
以下の最初と 2 番目のケースでは、2 つの .pdf ファイルを開くと仮定します (ただし、2 つの .ppt ファイルまたは 2 つの .doc ファイルを開いた場合も同じことが起こるようです)...
ケース 1: AcroRd32 が実行されていない場合、次のようなことを行います..
Process p = Process.Start("yada.pdf");
p.WaitForInputIdle();
p.Refresh();
物事は期待どおりに機能します。値 p.MainWindowHandle が正しく設定されています。この場合は問題ありません。
ケース 2: Process.Start() の呼び出し時に、AcroRd32 が以前に開いた PDF ファイルで既に実行されているとします。今、物事は奇妙になります。以下のコードを参照すると (わかりやすくするために一部のエラー チェック ロジックが削除されています)、Process.Start() の呼び出し後、p.MainWindowHandle の値は (ウィンドウが作成されても) ゼロであり、p.MainWindowTitle は空です。次に、1 秒間スリープし、ハンドルはまだゼロですが、mainwindowtitle が読み込まれるようになりました (スリープ後に p.Referesh() を呼び出さなかったにもかかわらず)。コメントは実行時に出力されます。
Process p = Process.Start("SomeFileName.pdf");
p.WaitForInputIdle();
p.Refresh();
if (p.MainWindowHandle == 0)
DebugTrace("MainWindowHandle is zero, why??"); //<<<<
if (p.MainWindowTitle.Length == 0)
DebugTrace("MainWindowTitle is null"); //<<<<
Thread.Sleep(1000);
if (p.MainWindowHandle == 0)
DebugTrace("MainWindowHandle is still zero."); //<<<<
if (p.MainWindowTitle.Length == 0)
DebugTrace("MainWindowTitle is null");
else
DebugTrace("MainWindowTitle: " + p.MainWindowTitle); //<<<<
これは、AcroRd32 が既に実行されているという事実と関係があると確信していますが、それを制御することはできず、p.MainWindowHandle の値を取得する必要があります。これを処理する方法はありますか?
ケース 3: 次に 3 番目のケース: 場合によっては、Process.Start() がファイルを正常に開いた場合でも null を返します。これは .jpg ファイルの場合に当てはまりますが、.jpg 拡張子に割り当てられたアプリケーションに依存していると確信しています。Process.Start("file.jpg") は、アプリケーションが "Windows Photo Viewer" の場合は null を返しますが、それを "Paint" に変更すると null は返されません。どうしたの?そして、どうすればハンドルを取得できますか?
詳細については申し訳ありませんが、解決しようとしている状況を説明していることを願っています!