关于将 WebBrowser 控件的视口比例(缩放和文本大小)与其他应用程序(例如 Internet Explorer 或本例中的帮助查看器)应用的设置同步的示例。
问题:
- 当使用 Internet Explorer 引擎呈现 HTML 内容的应用程序应用 Zoom a FontSize 缩放选项时,WebBrowser 控件在首次初始化时会将这些设置应用于其视图。
预期行为:
- 应用程序应提供更改缩放和字体大小比例的方法,与其他应用程序可能设置的内容无关。
- 应该应用新设置而不重新创建控件的句柄
在示例代码中,一个专用类WebBrowserHelper
包含一个从注册表读取当前缩放和字体大小设置的方法,以将 MenuItems 更新为当前值:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Zoom
=> ZoomFactor Key
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts\3
=> IEFontSize Key
ZoomFactor
键存储缩放级别乘以1000
:例如,缩放的150%
值为150000
,75%
缩放的值为75000
' WebBrowserHelper
sSetZoom()
方法使用 WebBrowser ActiveX 实例设置缩放级别,调用其ExecWb 方法,将值作为OLECMDID
参数传递,参数设置为,参数(缩放值)设置为指定缩放级别的整数值.OLECMDID_OPTICAL_ZOOM
OLECMDEXECOPT
OLECMDEXECOPT_DONTPROMPTUSER
pvaIn
▶ 这也会更新ZoomFactor
注册表项。
public static void SetZoom(WebBrowser browser, int zoomValue)
{
dynamic activex = browser.ActiveXInstance;
activex.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, zoomValue, 0);
}
和Keys 存储一个二进制值IEFontSize
,IEFontSizePrivate
在 rage 中[0-4]
。这些值大致对应于x-small
, small
, medium
, large
, x-large
CSS 设置。
使用乘数将FontSize
比例应用于文档正文:[Value + 1] * 4
。
该SetTextScale()
方法使用 WebBrowser ActiveX 实例设置 FonSize 比例,调用其ExecWb()
方法,将值作为OLECMDID
参数传递,参数设置为,并且参数(字体比例值)设置为指定范围内的整数值。OLECMDID_ZOOM
OLECMDEXECOPT
OLECMDEXECOPT_DONTPROMPTUSER
pvaIn
[0, 4]
▶ 这也会更新IEFontSize
注册表项。
public static void SetTextScale(WebBrowser browser, int textValue)
{
dynamic activex = browser.ActiveXInstance;
activex.ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, textValue, 0);
}
另一种选择是在 WebBrowser会话开始之前将 Zoom 和 FontSize 重置为默认值。
您可以调用该WebBrowserHelper.InternetResetZoomAndFont()
方法。将两个参数都设置为true
,它将缩放级别重置为 ,100%
并将 FontSize 重置为Medium
。
WebBrowserHelper.InternetResetZoomAndFont(true, true);
▶ 在这里,我添加了一些 ToolStripMenuItems,它们允许设置缩放值和 FontSize - 设置为预定义的比例 - 由 Internet Explorer 11 应用。
- 所有设置缩放的 ToolStripMenuItem 都分组在一个集合中,名为
zoomMenuItems
. 都使用相同的Click
事件处理程序,zoomToolStripMenuItems_Click
- 所有设置 FontSize 比例的 ToolStripMenuItem 都分组在一个名为 的集合中
textMenuItems
。都使用相同的Click
事件处理程序,textToolStripMenuItems_Click
- Zoom 和 Fontscale 值设置为
Tag
每个 ToolStripMenuItem 的属性(您当然可以使用任何其他方式将值与特定 ToolStripMenuItem 关联)
- 存储在命名值元组中的 Zoom 和 FontSize 的当前值,
browserViewSettings
假设 WebBrowser 控件名为webBrowser1
:
public partial class SomeForm : Form
{
private List<ToolStripMenuItem> textMenuItems = null;
private List<ToolStripMenuItem> zoomMenuItems = null;
private (int Zoom, int TextSize) browserViewSettings = (100, 2);
public SomeForm()
{
InitializeComponent();
textMenuItems = new List<ToolStripMenuItem> { textSmallestMenuItem, textSmallerMenuItem, textMediumMenuItem, textLargerMenuItem, textLargestMenuItem };
zoomMenuItems = new List<ToolStripMenuItem> { zoom75MenuItem, zoom100MenuItem, zoom125MenuItem, zoom150MenuItem, zoom175MenuItem, zoom200MenuItem, zoom250MenuItem, zoom300MenuItem, zoom400MenuItem };
// On startup, reads the current settings from the Registry
// and updates the MenuItems, to reflect the current values
UpdateMenus(true);
}
// MenuItems that sets the Font scale value
private void textToolStripMenuItems_Click(object sender, EventArgs e)
{
var item = sender as ToolStripMenuItem;
int newTextValue = Convert.ToInt32(item.Tag);
if (newTextValue != browserViewSettings.TextSize) {
browserViewSettings.TextSize = newTextValue;
UpdateDocumentSettings(this.webBrowser1);
UpdateMenus(false);
}
}
// MenuItems that sets the Zoom level value
private void zoomToolStripMenuItems_Click(object sender, EventArgs e)
{
var item = sender as ToolStripMenuItem;
int newZoomValue = Convert.ToInt32(item.Tag);
if (newZoomValue != browserViewSettings.Zoom) {
browserViewSettings.Zoom = newZoomValue;
UpdateDocumentSettings(this.webBrowser1);
UpdateMenus(false);
}
}
// Sets the new selected values and the related MenuItem
private void UpdateDocumentSettings(WebBrowser browser)
{
if (browser == null || browser.Document == null) return;
WebBrowserFeatures.WebBrowserHelper.SetZoom(browser, browserViewSettings.Zoom);
WebBrowserFeatures.WebBrowserHelper.SetTextScale(browser, browserViewSettings.TextSize);
}
// Updates the MenuItem to the current values
private void UpdateMenus(bool refresh)
{
if (refresh) {
browserViewSettings = WebBrowserFeatures.WebBrowserHelper.InternetGetViewScale();
}
zoomMenuItems.ForEach(itm => {
int refValue = Convert.ToInt32(itm.Tag);
itm.Checked = refValue == browserViewSettings.Zoom;
if (itm.Checked) {
zoomToolStripMenuItem.Text = $"Zoom ({refValue}%)";
}
});
textMenuItems.ForEach(itm => itm.Checked = Convert.ToInt32(itm.Tag) == browserViewSettings.TextSize);
}
WebBrowserHelper
班级:
using System.Security;
using System.Security.AccessControl;
using Microsoft.Win32;
public class WebBrowserHelper
{
private const int OLECMDID_ZOOM = 19;
private const int OLECMDID_OPTICAL_ZOOM = 63;
private const int OLECMDEXECOPT_DONTPROMPTUSER = 2;
// Applies the Zoom value. It also updates the Registry
public void SetZoom(WebBrowser browser, int zoomValue)
{
dynamic activex = browser.ActiveXInstance;
activex.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, zoomValue, 0);
}
// Applies the FontSize scale. It also updates the Registry
public void SetTextScale(WebBrowser browser, int textValue)
{
dynamic activex = browser.ActiveXInstance;
activex.ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, textValue, 0);
}
private static string keyZoomName = @"Software\Microsoft\Internet Explorer\Zoom";
private static string keyTextName = @"Software\Microsoft\Internet Explorer\International\Scripts\3";
private static string keyValueTextReset = "ResetZoomOnStartup";
private static string keyValueZoomReset = "ResetZoomOnStartup2";
public static (int Zoom, int TextSize) InternetGetViewScale()
{
int zoomValue, textValue;
using (var zoomKey = Registry.CurrentUser.OpenSubKey(keyZoomName,
RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey)) {
zoomValue = (int)zoomKey.GetValue("ZoomFactor", 100000) / 1000;
}
using (var textKey = Registry.CurrentUser.OpenSubKey(keyTextName,
RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey)) {
var keyBValue = BitConverter.GetBytes(2);
textValue = BitConverter.ToInt32((byte[])textKey.GetValue("IEFontSize", keyBValue), 0);
}
return (zoomValue, textValue);
}
public static void InternetResetZoomAndFont(bool resetZoom, bool resetFontSize)
{
int keyZoomValue = resetZoom ? 1 : 0;
int keyFontValue = resetFontSize ? 1 : 0;
using (var zoomKey = Registry.CurrentUser.OpenSubKey(keyZoomName,
RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.WriteKey)) {
zoomKey.SetValue(keyValueZoomReset, keyZoomValue, RegistryValueKind.DWord);
zoomKey.SetValue(keyValueTextReset, keyFontValue, RegistryValueKind.DWord);
}
var current = InternetGetViewScale();
if (resetZoom) current.Zoom = 100;
if (resetFontSize) current.TextSize = 2;
InternetSetViewScale(current.Zoom, current.TextSize);
}
}
这是它的工作原理: