检查是否安装了PDF阅读器

本文关键字:PDF 是否 安装 检查 | 更新日期: 2023-09-27 18:08:41

我的Application中有一个Help函数,它由一个webbrowser control组成。webbrowser 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阅读器,并让用户首先安装它,你不必检查pdf阅读器,因为你知道已经安装了一个,如果没有,你可以说这是用户的错误,他们不能使用帮助功能,因为你为他们提供了一种使用已发布的项目轻松安装pdf阅读器的方法。

检查是否安装了PDF阅读器

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

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

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

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

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

John Willemse建议的c#实现方法(在Windows 10的非n版本中不会将Edge识别为默认查看器):

    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;
        }
    }