私の目標は、プロセスを少なくとも 5 秒間 (実際には任意の時間) 強制的に実行することです。私は Service Pack 1 を使用して .NET Framework 3.5 を使用しています。ドキュメントにはユーザーが表示する必要がある情報が含まれているため、ドキュメントをすぐにクリックして閉じるのを防ぐために、強制的に開いたままにすることができます。しばらくの間。ボタンと 3 つのラジオ ボタン (ドキュメントごとに 1 つ) で構成される小さなテスト UI を開発しました。これが私のコードビハインドです...
ファイル パスの文字列、選択したファイルのパスの文字列、プロセスの ID を格納する int 、プログラムを終了できるかどうかのブール値、.. などのスレッドとタイマーの宣言を定義します。
string WordDocPath = @"Some file path\TestDoc_1.docx";
string PowerPointPath = @"Some file path\Test PowerPoint.pptx";
string TextFilePath = @"Some file path\TestText.txt";
string processPath;
int processID;
bool canExit = false;
System.Threading.Thread processThread;
System.Timers.Timer processTimer;
コンストラクターで、スレッドとタイマーを初期化し、スレッドの開始メソッドを TimerKeeper() というメソッドに設定してから、スレッドを開始します。
processTimer = new System.Timers.Timer();
processThread = new System.Threading.Thread(new System.Threading.ThreadStart(timeKeeper));
processThread.Start();
タイマーを 5 秒にカウントするように設定し、その時点で canExit ブール値を true に設定します。
public void timeKeeper()
{
processTimer.Elapsed += new System.Timers.ElapsedEventHandler(processTimer_Elapsed);
processTimer.AutoReset = false;
processTimer.Interval = 5000; //5000 milliseconds = 5 seconds
}
void processTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
canExit = true;
}
残りはボタンのクリックイベントで、プロセスを開始するために使用するファイルパスを決定し、タイマーを開始してから、プロセス自体を開始します..
private void button1_Click(object sender, RoutedEventArgs e)
{
if ((bool)PowerPointRadioButton.IsChecked)
{
processPath = PowerPointPath;
}
if ((bool)WordDocRadioButton.IsChecked)
{
processPath = WordDocPath;
}
if ((bool)TextDocRadioButton.IsChecked)
{
processPath = TextFilePath;
}
try
{
canExit = false;
processTimer.Start();
while (!canExit)
{
processID = System.Diagnostics.Process.Start(processPath).Id;
System.Diagnostics.Process.GetProcessById(processID).WaitForExit();
if (!canExit)
{
processTimer.Stop();
MessageBox.Show("Document must remain open for at least 5 seconds.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
processTimer.Start();
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error dealing with the process.\n" + ex.Message.ToString());
}
ほとんどの場合、これは実際に機能します。ユーザーは引き続きドキュメントを閉じることができますが、5 秒経過していない場合は再度開きます。Word ドキュメント (.docx) を除きます。パワーポイントとテキスト ファイルは問題なく動作しますが、Word 文書は奇妙な動作をします (3 つのファイルはすべて同じファイル ディレクトリにあることに注意してください)。Word ドキュメントのラジオ ボタンを選択してボタンをクリックすると、Word ドキュメントが開きますが、catch ブロックからメッセージ ボックスが表示され、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という例外が発生したことが警告されます。投げた。これはワード文書でのみ発生します。私が言ったように、ワード文書はまだ開きます (パワーポイントやテキストファイルと同じように、その内容を見ることができます)。この例外により、終了できるかどうかを確認する行がスキップされます。
誰でもここで私の問題を見ることができますか? または、これをすべて行うためのより良い方法がある場合 (私は wpf/c# 初心者です)? なぜこれがワード文書でのみ発生し、パワーポイントやテキストファイルでは発生しないのか理解できません.