2

我正在使用 PDFSharp 创建 PDF。在他们的示例中,他们保存一个 PDF,然后他们开始一个过程来选择您的查看器来打开它。它看起来像这样:

document.Save(fileName);
Process.Start(fileName);    

所以在我的测试中,我意识到如果 Acrobat Reader 已经打开,我会收到一个 i/o 异常,因为该进程已经在运行。所以我尝试关注这篇文章: Detecting a Process is already running in windows using C# .net

关于检测过程。所以我把上面的代码改成这样:

        document.Save(fileName);
        if (System.Diagnostics.Process.GetProcessesByName("AcroRd32.exe").Length == 0)
        {
            Process.Start(fileName);    
        }

所以我有两个问题。
1)这不起作用。长度始终为 0,所以我想知道是返回错误的进程还是找不到进程。当我查看任务管理器时,AcroRd32.exe 是正在运行的进程的名称。

2)有没有更好的方法来做到这一点?似乎我正在将此过程硬编码到代码中,并且我不确定是否有更好的方法来捕获其他版本的 Acrobat(例如是否有 64 位版本)或其他 PDF 查看器。

对不起,如果这是菜鸟问题。这个 .NET 对我来说很新。谢谢。

4

2 回答 2

3

是一个非常好的来源,并且涵盖了您所要求的所有内容。

这是从上面的链接中获取的一些示例代码:

Process[] collectionOfProcess = Process.GetProcessesByName("AcroRd32");
            if (collectionOfProcess.Length >= 1)
            {
                Process acrProcess = collectionOfProcess[0];
                
                MessageBox.Show(acrProcess.MainWindowTitle);// file name of the which is opened.

                MessageBox.Show("Acrobet reader running");
            }

此外,我曾见过程序无法检测或“工作”权限高于其权限的进程的情况。确保 adobe reader 没有在管理员权限下运行,如果是,请确保您的程序也是如此。

希望这可以帮助!

于 2013-01-11T00:32:58.043 回答
0

如果您传递刚刚创建的 PDF 文件的文件路径而不是尝试启动 Acrobat Reader,Windows 将使用与文件扩展名Process.Start关联的默认应用程序打开 PDF 。.pdf您甚至不需要知道他们安装了哪些阅读器。如果没有安装阅读器,Windows 将提示用户选择一个应用程序来打开它。这是直接启动 Acrobat Reader 的更好选择,因为它将使用用户首选的阅读器打开 PDF 文件。

如果这是您已经在做的事情(我怀疑它来自问题),那么您很可能会收到 IO 异常,因为生成的 PDF 文件仍然在 PDFSharp 或您的代码中打开(即某些东西已锁定),这意味着Acrobat Reader 无法打开它。启动已在运行的进程不应导致该错误。

于 2013-01-11T00:32:18.510 回答