6

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

4

3 回答 3

5

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

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

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

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

于 2013-04-12T07:31:25.200 回答
2

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

于 2013-04-12T07:27:33.110 回答
0

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

    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;
        }
    }
于 2017-06-16T10:05:36.963 回答