无法打开PDF,有没有办法检测它是否打开?

时间:2014-05-14 21:56:36

标签: c# pdf

我正在编写一个C#Windows程序。在表格上,我有一个网站和PDF列表。当他们点击PDF时,代码会下载该文件,然后尝试打开它。在我的Windows 8机器上,PDF打开正常。在Windows 7和XP机器上,它们没有打开,也没有可视线索显示出现问题。 (在这两台计算机上,您可以单击文件资源管理器中的PDF,PDF将打开。)

我从查看Opening a pdf in .NET开始,然后加入其中。这是我用的......

if (File.Exists(localFileName))
{
    //MessageBox.Show("calling file " + localFileName, "FYI...");
    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = "cmd.exe";
    startInfo.Arguments = "call /c " + localFileName;
    process.StartInfo = startInfo;
    try
    {
        //MessageBox.Show("calling file " + localFileName, "FYI...");
        if (!process.Start())
        {
            MessageBox.Show("Could not invoke the PDF Viewer. Try opening the file at " + localFileName, 
                "Problem Opening File...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            return;
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show("Couldn't start process (call " + localFileName + "), Message=" + exc.Message, 
        "Problem Encounter...", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    //MessageBox.Show("Should be done", "FYI...");
}

我正在尝试检测过程是否开始。如果我无法让它们执行,那么如果我能显示一条消息告诉用户打开下载文件的位置会有所帮助。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

问题似乎与许可相关。我添加了process.Verb = "runas"以将其提升到管理级别,并且它可以在Windows 7计算机上运行。在XP机器上,它提示输入管理员密码,这不是很好,但应该足够我的目的......

答案 1 :(得分:0)

你的代码完全错了。 cmd.exe完全没有必要参与此操作,也不需要call /c(并且绝对不需要提升你的答案建议)。

if FileExists(localFileName) {
    try
    { 
      System.Diagnostics.Process.Start(localFileName); 
    catch
    }
      /* 
         Handle failure to start process (Win32Exception)
         No need to handle FileNotFoundException, because
         you can do that in the else below
      */
    };
}
else
{
  // Handle missing file
}
不需要

cmd.exe,因为它打开Windows命令处理器的新实例(AKA是一个命令提示符),只有在call /c另一个批处理文件时才需要CALL在批处理文件中。正如你的答案所暗示的那样,当然没有必要提升这个过程。