0

我的目标是强制进程运行至少 5 秒(实际上是任何时间)。我正在使用带有 Service Pack 1 的 .NET Framework 3.5。这个想法是文档包含一些用户必须看到的信息,因此为了防止他们立即单击关闭文档,我们可以强制它保持打开状态一段时间。我开发了一个小型测试 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)。powerpoint 和 text 文件进展顺利,但 word 文档有一些奇怪的行为(请注意,所有 3 个文件都在同一个文件目录中)。当我选择 word 文档单选按钮并单击该按钮时,word 文档将打开,但我也收到来自 catch 块的消息框的提示,提醒我“对象引用未设置为对象上的实例”异常是抛出。这只发生在 word 文档中。就像我说的,word 文档仍然打开(我可以看到它的内容,就像 powerpoint 或文本文件一样)。异常会导致检查是否可以退出的行被跳过,

谁能在这里看到我的问题?或者是否有更好的方法来完成所有这些(我是 wpf/c# 新手)?我只是不明白为什么这只发生在 word 文档中,而不是 powerpoint 和文本文件。

4

2 回答 2

1

如果这是在用户的桌面上运行,您将受到安装的正确应用程序(例如 Word)及其配置方式的影响。如果这些是共享上的只读文件,那么我可以将它们转换为 XPS,以便您可以在 DocumentViewer 中显示它们。与其强迫他们等待 5 秒点击,不如让他们对已阅读并理解文档的对话框说“是”。或者按照 MilkyWayJoe 的建议,将其放在带有“我同意”按钮的页面上。

于 2012-05-07T20:19:05.267 回答
0

问题可能是关联的应用程序不是单词应用程序本身,而是一些代表您启动单词的中间应用程序。

要找出答案,请保留对进程对象的引用,并检查它是否已经终止,它的可执行路径是什么。

话虽如此,您为什么需要这种烦人的行为?你不能阻止人们另眼相看。是否应该满足某些法律要求或其他什么?

于 2012-05-07T20:25:08.327 回答