问题描述
我有一个在 webbrowser 控件中显示 pdf 的应用程序,使用以下代码
webbrowser1.Navigate(filename + "#toolbar=0");
如果安装了 Adobe Reader 就完美了
我想在显示窗口之前检查是否安装了 Adobe Acrobat Reader,或者至少在尝试显示 pdf 时。
我从这里改编了以下代码Check Adobe Reader is installed (C#)?
正如评论中提到的,不幸的是,它也会标记已卸载的版本。 我也在同一篇文章中尝试了 64 位代码,但发现了我无法轻松解决的错误,并且怀疑无论如何都会给出相同的结果,因为它以类似的方式简单地查看注册表。
using System;
using Microsoft.Win32;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
RegistryKey adobe = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Adobe");
if(null == adobe)
{
var policies = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Policies");
if (null == policies)
return;
adobe = policies.OpenSubKey("Adobe");
}
if (adobe != null)
{
RegistryKey acroRead = adobe.OpenSubKey("Acrobat Reader");
if (acroRead != null)
{
string[] acroReadVersions = acroRead.GetSubKeyNames();
Console.WriteLine("The following version(s) of Acrobat Reader are installed: ");
foreach (string versionNumber in acroReadVersions)
{
Console.WriteLine(versionNumber);
}
}
}
}
}
}
如果未加载 Adobe pdf Reader,则会出现打开(在任何其他已安装的阅读器中)、保存文件或取消的提示。 我希望能够拦截此内容以指示 Adobe 的阅读器不可用。 我试过了
private void webbrowser1_Navigating(object sender,WebbrowserNavigatingEventArgs e)
{
string url = e.Url.ToString();
if (url.StartsWith("res://ieframe.dll/navcancl.htm") && url.EndsWith("pdf"))
{
e.Cancel = true;
MessageBox.Show("Cannot open PDF!");
}
}
在以下https://social.msdn.microsoft.com/Forums/en-US/46aaeecd-5317-462a-ac36-9ebb30ba90e7/load-pdf-file-using-webbrowser-control-in-windows-form-c?forum=csharpgeneral 但发现打开,保存取消事件发生在 webbrowser1_Navigating 之前。
我将不胜感激任何有关不会标记已卸载版本的可靠解决方案的帮助,或将停止打开、保存、取消提示并允许我创建消息以安装阅读器的单独解决方案
谢谢
解决方法
简单的方法是使用try/catch 在尝试给出代码。 如果出现错误,Web 浏览器将给出错误,因此在捕获中说用户安装 adobe 阅读器。 这是示例
try
{
//your code goes her
}
catch(Exception ex)
{
if(ex.Message != null)
{
Console.WriteLine("Adobe Reader not Installed");
//this is where you say adobe reader is not installed
}
}