0

私の目標は、プロセスを少なくとも 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# 初心者です)? なぜこれがワード文書でのみ発生し、パワーポイントやテキストファイルでは発生しないのか理解できません.

4

2 に答える 2

1

これがユーザーのデスクトップで実行される場合、インストールされている適切なアプリ (Word など) とその構成方法に左右されます。これらが共有上の読み取り専用ファイルである場合は、それらを XPS に変換して、DocumentViewer で表示できるようにすることができます。そして、クリックするのに 5 秒間待たせるのではなく、ドキュメントを読んで理解したというダイアログ ボックスに対して、はいと言わせます。または、MilkyWayJoe が提案したように、「同意する」ボタンのあるページにこれを置いてください。

于 2012-05-07T20:19:05.267 に答える
0

問題は、関連するアプリケーションが単語アプリケーション自体ではなく、ユーザーに代わって単語を起動する中間アプリケーションである可能性があります。

調べるには、プロセスオブジェクトへの参照を保持し、それがすでに終了しているかどうか、実行可能パスが何であるかを確認します。

そうは言っても、なぜこの迷惑な行動が必要なのですか?あなたは人々が他の見方をするのを止めることはできません。何らかの法的要件などを満たすことが想定されていますか?

于 2012-05-07T20:25:08.327 に答える