检查是否安装了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阅读器的方法。
除了知道是否有用之外,您可能还可以检查以下注册表项:
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;
}
}