检查是否安装了任何类型的PDF Reader

时间:2013-04-12 07:14:30

标签: c# visual-studio pdf

我的Help中有Application个功能,其中包含一个webbrowser controlwebbrowser control填充了.pdf file.pdf file的来源是我们自己的网站。

问题是,不是每个人都会在他们的机器上安装PDF Reader,所以我想检查是否安装了一个:是或否。我搜索了互联网,我主要在Stackoverflow上看到用户想要检查是否安装了Adobe Reader,这不是我想要的。我需要知道机器上是否安装了PDF Reader

我确实找到了以下代码,这可能对我有所帮助:

public void CheckPdfReaderAvailable()      
{      
    RegistryKey key = Registry.ClassesRoot.OpenSubKey(".pdf");      
    Assert.IsNotNull(key);      
}  

当我查看上面的代码时,我的想法是代码检查registry是否知道.pdf format,但我不确定。

有人可以告诉我如何使用上面的代码或者给我一个例子,说明我应该如何解决这个问题?

提前致谢!

修改

以下答案帮助了我:https://stackoverflow.com/a/774482/1661209

另一种解决此问题的方法是将pdf reader lite添加到先决条件并让用户首先安装,您不必检查pdf Reader,因为您知道安装了一个pdf Reader,如果它是不是你可以说用户不能使用帮助功能是错误的,因为你为他们提供了一种方法,可以使用已发布的项目轻松安装PDF阅读器。

3 个答案:

答案 0 :(得分:5)

除了知道是否有用外,您可能会检查以下注册表项:

HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/pdf

这将有一个条目CLSID,它指向默认应用程序的类ID。

如果注册表项或CLSID值不存在,则MIME类型未知,或者没有默认应用程序来处理MIME类型application/pdf文件。

答案 1 :(得分:2)

您可以直接查询注册表,但推荐的解决方案是使用IQueryAssociations界面查看是否有注册的程序打开pdf。可以在pinvoke.net上找到一个示例。

答案 2 :(得分:0)

John Willemse建议的方法的C#实现(不会将Edge识别为非N版Windows 10上的默认查看器):

    private bool CanOpenPDFFiles
    {
        get
        {
            bool CLSIDpresent = false;

            try
            {
                using (Microsoft.Win32.RegistryKey applicationPDF = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(@"MIME\Database\Content Type\application/pdf"))
                {
                    if (applicationPDF != null)
                    {
                        var CLSID = applicationPDF.GetValue("CLSID");
                        if (CLSID != null)
                        {
                            CLSIDpresent = true;
                        }
                    }
                }
            }
            catch (Exception)
            {

            }

            return CLSIDpresent;
        }
    }