- PR -

オープンしたマルチドキュメントファイルが終了するのを待つには?

1
投稿者投稿内容
ドラゴン
会議室デビュー日: 2007/03/28
投稿数: 7
投稿日時: 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)
{
//終了後の処理…
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-03-28 19:47
引用:

ドラゴンさんの書き込み (2007-03-28 19:23) より:

掲題のようにC#アプリケーションでオープンしたマルチドキュメントファイル(Word,Excel等)を終了するまで待つにはどうすれば宜しいでしょうか?


Word, Excel などの Office 製品に限っては、Office PIA のイベントを利用した方が良いかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ドラゴン
会議室デビュー日: 2007/03/28
投稿数: 7
投稿日時: 2007-03-28 20:08
ドラゴンです、早速のご返答ありがとう御座います。
左様の通り確かエクセルでのVBA操作の為エクセル限定で
Office PIAを使用してクローズイベントハンドルを制約しています。

ですが、オープンするのはMicrosoft Officeに限らず、
あらゆるファイルが可能になっています。
その中でシングルドキュメント(txt,jpg)は問題なく稼動できますが、
マルチドキュメント(word,excel,pdf)はその終了をうまく判定できません。

オープンしたドキュメントのプロセスがMDIか、SDIかを判定してから、
各対応を行うのではないかとの気がしますが、何かの解決策はないでしょうか。

宜しくお願いします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-03-29 06:36
引用:

ドラゴンさんの書き込み (2007-03-28 20:08) より:
ですが、オープンするのはMicrosoft Officeに限らず、
あらゆるファイルが可能になっています。


統一的な方法はありません。したがってそれぞれのアプリケーション、及びデータ形式ごとに最適と思われる方法を実装してください。

少なくともプロセスを監視する方法ではWORDやExcelがファイルを閉じたことを監視するのは不可能でしょう。ファイルと閉じると言う行為と、プロセスを終了すると言う行為は、全く関係名別々の操作ですからね。
ドラゴン
会議室デビュー日: 2007/03/28
投稿数: 7
投稿日時: 2007-03-29 15:37
甕星さん、朝から気になってくださってありがとう御座いました。
仰った通りに、考え方を変わって見ます。

ディスクで格納されたファイルのステータスの監視でやって見る予定ですが、
成功した次第にそのコードを載って置きます。
ドラゴン
会議室デビュー日: 2007/03/28
投稿数: 7
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)