最近做一个WPF触屏的项目,引用到WebBrowser控件,由于是触屏的所以控件里的网页可以缩放和平移,由于业务需求,需要禁用这两个功能。
于是网上找了很多资料,也换过控件。后来找到一个完美的解决方案,我在这里直接共享出来。
• 要禁用ie内容缩放,需要设置css样式 :-ms-content-zooming: none;
• 要禁用ie内容平移,需要设置css样式: -ms-touch-action:none; 这里我使用 -ms-touch-action: pan-y;仅允许y轴平移。
更多设置请参考微软官方文档Scrolling and zooming with touch
但是这些css样式只在ie10以上生效,且WebBrowser控件默认是用ie7渲染的。并且WebBrowser默认忽略Zoom和Pan样式属性。
微软提供管理Internet Explorer和承载WebBrowser控件的应用程序的单个特性的注册表键。通过修改注册表键,我们可以:
• 使WebBrowser控件默认使用指定的ie版本渲染内容;
• 使WebBrowser不会忽略Zoom和Pan样式属性;
一、设置浏览器仿真
Windows Internet Explorer 8及以后版本。The FEATURE_BROWSER_EMULATION特性定义了Internet Explorer的默认模拟模式,并支持以下值。
11001 (0x2AF9) | IE11. 不管声明的!DOCTYPE指令如何,网页都会在IE11 edge模式下显示。没有声明!DOCTYPE指令会导致页面加载异常。 |
11000 (0x2AF8) | IE11. 包含基于标准的!DOCTYPE指令的网页在IE11 edge模式下显示。IE11的默认值。 |
10001 (0x2711) | IE10. 网页显示在IE10标准模式下,而不考虑!DOCTYPE指令。 |
10000 (0x02710) | IE10. 包含基于标准的!DOCTYPE指令的网页在IE10标准模式下显示。IE10的默认值。 |
9999 (0x270F) | IE9. 不管声明的!DOCTYPE指令如何,网页都会以IE9标准模式显示。没有声明!DOCTYPE指令会导致页面加载异常。 |
9000 (0x2328) | IE9. 包含基于标准的!DOCTYPE指令的网页在IE9模式下显示。IE9的默认值。
在IE10中很重要的一点是,包含基于标准的DOCTYPE指令的网页在IE10标准模式下显示。
|
8888 (0x22B8) | IE8. 不管声明的!DOCTYPE指令如何,网页都会以IE8标准模式显示。没有声明!DOCTYPE指令会导致页面加载异常。 |
8000 (0x1F40) | IE8. 包含基于标准的!DOCTYPE指令的网页在IE8模式下显示。IE8的默认值。
在IE10中很重要的一点是,包含基于标准的DOCTYPE指令的网页在IE10标准模式下显示。
|
7000 (0x1B58) | IE7. 包含基于标准的!DOCTYPE指令的网页在IE7标准模式下显示。 承载WebBrowser控件的应用程序的默认值。 |
修改注册表中FEATURE_BROWSER_EMULATION键就可以控制WebBrowser控件用什么版本的ie渲染.
1.找到注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
2.添加DWORD(32位)值,重命名为你的程序名,例如QQMusic.exe
3.根据上面表格对应的数值设置十进制数值,例如要使WebBrowser强制使用ie11渲染,就将十进制数值设置为11001
二、禁用阻塞本地Script脚本
Internet Explorer 7及以后版本。在启用阻塞本地Script脚本特性时,允许存储在本地机器区域的脚本仅在从本地机器区域加载的网页上运行.该属性默认时启用的(DWORD) 00000001,我们需将他设为禁用(DWORD) 00000000.
1.找到注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BLOCK_LMZ_SCRIPT
2.添加DWORD(32位)值,并重命名.
3.将十进制数值设置为00000000
三、禁用传统输入模式
由于微软在Windows 8以上引入了新的输入模式,为了使遗留的应用程序提供最广泛的兼容性,WebBrowser控件在Windows 8以上的系统中会模拟Windows 7鼠标、触摸和笔的输入模式。
传统输入模式启用时:
• Trident渲染引擎(mshtml.dll)不处理Windows指针消息。
• 文档对象模型(DOM)指针和手势事件不会触发。
• 鼠标和触摸信息按Windows 7输入模式发送。
• 触摸选择遵循Windows 7模式(“拖动至选择”),而不是Windows 8模式(“点击至选择”)。
• 硬件加速平移和缩放被禁用。
• Zoom和Pan样式属性将会被忽略
因为传统输入模式默认是开启的,这将导致我们的Zoom和Pan样式属性无法生效,修改注册表禁用此键.
1.找到注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControlFEATURE_NINPUT_LEGACYMODE
2.添加DWORD(32位)值,并重命名.
3.将十进制数值设置为00000000
我们只需在程序启动的时候调用以下方法:
private void SetBrowSerCompatibilityModel() { //获取程序名称 var fileName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); if (string.Compare(fileName, "devenv.exe", true) == 0)//确定不是在vs中运行 return; //设置浏览器仿真 using (RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree)) { key.SetValue(fileName,10000, RegistryValueKind.DWord); } //禁用阻塞本地Script脚本 using (RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BLOCK_LMZ_SCRIPT", RegistryKeyPermissionCheck.ReadWriteSubTree)) { key.SetValue(fileName,0, RegistryValueKind.DWord); } //禁用传统输入模式 using (RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_NINPUT_LEGACYMOD", RegistryKeyPermissionCheck.ReadWriteSubTree)) { key.SetValue(fileName,0, RegistryValueKind.DWord); } }
示例代码 https://github.com/LenLiin/WebBrowserDemo