- - PR -
オープンしたマルチドキュメントファイルが終了するのを待つには?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-03-28 19:23
掲題のようにC#アプリケーションでオープンした
マルチドキュメントファイル(Word,Excel等)を 終了するまで待つにはどうすれば宜しいでしょうか? 下記のようなコードではシングルドキュメントは問題なく、 そのプロセスの終了を判定できますが、 マルチドキュメントの場合はうまく判定ない状況です。 private Process process = null; process = new Process(); process.EnableRaisingEvents = true; process.Exited += new EventHandler(this.OnProcessClosed); process.StartInfo.FileName = strTempFileName; process.Start(); process.WaitForExit(); if (process.HasExited == true) { //終了後の処理… } | ||||
|
投稿日時: 2007-03-28 19:47
Word, Excel などの Office 製品に限っては、Office PIA のイベントを利用した方が良いかもしれません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-03-28 20:08
ドラゴンです、早速のご返答ありがとう御座います。
左様の通り確かエクセルでのVBA操作の為エクセル限定で Office PIAを使用してクローズイベントハンドルを制約しています。 ですが、オープンするのはMicrosoft Officeに限らず、 あらゆるファイルが可能になっています。 その中でシングルドキュメント(txt,jpg)は問題なく稼動できますが、 マルチドキュメント(word,excel,pdf)はその終了をうまく判定できません。 オープンしたドキュメントのプロセスがMDIか、SDIかを判定してから、 各対応を行うのではないかとの気がしますが、何かの解決策はないでしょうか。 宜しくお願いします。 | ||||
|
投稿日時: 2007-03-29 06:36
統一的な方法はありません。したがってそれぞれのアプリケーション、及びデータ形式ごとに最適と思われる方法を実装してください。 少なくともプロセスを監視する方法ではWORDやExcelがファイルを閉じたことを監視するのは不可能でしょう。ファイルと閉じると言う行為と、プロセスを終了すると言う行為は、全く関係名別々の操作ですからね。 | ||||
|
投稿日時: 2007-03-29 15:37
甕星さん、朝から気になってくださってありがとう御座いました。
仰った通りに、考え方を変わって見ます。 ディスクで格納されたファイルのステータスの監視でやって見る予定ですが、 成功した次第にそのコードを載って置きます。 | ||||
|
投稿日時: 2007-04-02 11:03
お待たせしました。解決したコードを貼って置きます。
皆さんありがとう御座いました。ご参照になると嬉しいです。 #region"<<API関数用>>" [DllImport("kernel32.dll")] static extern IntPtr OpenFile(string lpFileName, out OFSTRUCT lpReOpenBuff,uint uStyle); [DllImport("kernel32.dll")] private static extern bool CloseHandle ( int hObject ); private const int OF_SHARE_DENY_READ = unchecked((int)0x30); /// <summary> /// API関数用のコンスト /// </summary> [System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential)] public struct OFSTRUCT { public byte cBytes; public byte fFixedDisc; public UInt16 nErrCode; public UInt16 Reserved1; public UInt16 Reserved2; [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 128)] public string szPathName; } OFSTRUCT OF; #endregion process = new Process(); process.StartInfo.FileName = strTempFileName; process.Start(); intFileOpen = 0; Thread.Sleep(2000); this.timerExcleClose.Interval = 1; this.timerExcleClose.Start(); private void timerExcleClose_Tick(object sender, EventArgs e) { try { if (intFileOpen == 0) { bool blnFileOpen = IsUse(strTempFileNm); if (blnFileOpen == false) { onProcessClosed(); this.timerExcleClose.Stop(); } } } catch (Exception ex) { throw ex; } } public bool IsUse(string strFileName) { Int32 HFile; HFile = OpenFile(strFileName, out OF, OF_SHARE_DENY_READ).ToInt32(); if (HFile == -1) { return true; } else { CloseHandle(HFile); return false; } } //timerExcleClose_Tick はタイマーです。 //ファイルのオープン状態は主にOpenFileのAPI関数で行いました。 以上。 |
1