直接使用webbrower,会发现其对js支持不友善,会弹出一些警告框,然后停止运行js,导致页面无法渲染成功.
在此要自己封装一次webbrower,对于这些js警告进行静默化
需要添加引用 Microsoft Internet control
public class MyWebBrowser : System.Windows.Forms.WebBrowser
{
private SHDocVw.IWebBrowser2 Iwb2;
protected override void AttachInterfaces(object nativeActiveXObject)
{
Iwb2 = (SHDocVw.IWebBrowser2)nativeActiveXObject;
Iwb2.Silent = true;
base.AttachInterfaces(nativeActiveXObject);
}
protected override void DetachInterfaces()
{
Iwb2 = null;
base.DetachInterfaces();
}
}
这样webbrower就不会弹出js警告框,因为关闭了调试模式
通常情况下 win7装的ie是 ie9 ,但是默认情况下webbrow会使用ie7的兼容模式来渲染页面,所以需要在html页面添加,后来自己升级ie9到ie11,页面明显快多了
<!-- 强制使用最新版ie内核渲染 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
如果把winform窗口设置为无边框模式,那么想实现拖动html界面,窗口同样跟着移动,实现方式如下
首先自定义一个拖动控件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MoveControns
{
public partial class MoveContron : Component
{
public MoveContron()
{
InitializeComponent();
}
public MoveContron(IContainer container)
{
container.Add(this);
InitializeComponent();
}
public void MoveEvent()
{
if (WinApiMove)
{
dropForm.MouseDown += new MouseEventHandler(WinApiMoveEvent);
}
else
{
dropForm.MouseDown += new MouseEventHandler(MouseDownEvent);
dropForm.MouseMove += new MouseEventHandler(MouseMoveEvent);
dropForm.MouseUp += new MouseEventHandler(MouseUpEvent);
}
}
#region 变量声明
private bool isMouse = false; //记录是否按下
private int mousedownleft = 0;
private int mousedowntop = 0;
private System.Windows.Forms.Form dropForm = null;
private bool WinApiMove = true;
/// <summary>
/// 移动的样式,当不为真时候立即移动
/// </summary>
[Category("Alignment"), Description("移动的样式,当不为真时候立即移动")]
public bool MoveBorder
{
set { WinApiMove = value; }
get { return WinApiMove; }
}
/// <summary>
/// 需要移动的窗体
/// </summary>
[Category("Alignment"), Description("需要移动的窗体")]
public System.Windows.Forms.Form form
{
set { dropForm = value; }
get { return dropForm; }
}
#endregion
#region win32 api 移动窗体
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
public void WinApiMoveEvent()
{
ReleaseCapture();
SendMessage(dropForm.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
public void WinApiMoveEvent(object sender, System.Windows.Forms.MouseEventArgs e)
{
ReleaseCapture();
SendMessage(dropForm.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
#endregion
public void MouseDownEvent()
{
isMouse = true;
mousedownleft = GetMouseXY().X - dropForm.Left;
mousedowntop = GetMouseXY().Y - dropForm.Top;
}
private void MouseDownEvent(object sender, System.Windows.Forms.MouseEventArgs e)
{
isMouse = true;
mousedownleft = GetMouseXY().X - dropForm.Left;
mousedowntop = GetMouseXY().Y - dropForm.Top;
}
public void MoveStarEvent()
{
if (isMouse == false)
{
return;
}
dropForm.Left = GetMouseXY().X - mousedownleft;
dropForm.Top = GetMouseXY().Y - mousedowntop;
}
private void MouseMoveEvent(object sender, System.Windows.Forms.MouseEventArgs e)
{
MoveStarEvent();
}
public void MouseUpEvent()
{
if (isMouse == true) //如果还是真
{
isMouse = false;
}
}
private void MouseUpEvent(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (isMouse == true) //如果还是真
{
isMouse = false;
}
}
/// <summary>
/// 获取鼠标坐标
/// </summary>
/// <returns></returns>
public System.Drawing.Point GetMouseXY()
{
System.Drawing.Point xy = new System.Drawing.Point(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y);
return xy;
}
}
}
编译后拖到窗口中,如图设置
然后在html添加
<span οnmοusedοwn="window.external.winmove()" οnmοuseοver="this.style.cursor = 'move';"
οnmοuseοut="this.style.cursor='default'">11111111</span>
同时在窗体添加
public MianWindow()
{
InitializeComponent();
this.webBrowser1.ObjectForScripting = this;
this.moveContron1.MoveEvent();
}
public void winmove()
{
this.moveContron1.WinApiMoveEvent();
}
c#和js的交互 网上有很多方法,详见附件
最终实现的一个效果如图
研究到这里,我也基本上就放弃了,因为存在一个严重的bug,就是webrower和其他窗口控件层级的问题,因为需要引用其他的一些控件,这些是没法嵌入html界面的
除非这个应用不会引入其他控件.
附件下载