我的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 Reader,如果它是不是你可以说用户不能使用帮助功能是错误的,因为你为他们提供了一种方法,可以使用已发布的项目轻松安装PDF阅读器。
答案 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;
}
}