Stu*_*art 7 c# mdiparent webbrowser-control
我试图在我的一个应用程序中实现一个简单的Web浏览器控件.这是为了帮助将Web应用程序集成到我正在创建的工具集中.
问题是,这个网络应用程序绝对喜欢弹出窗口....
当弹出窗口打开时,它会在IE窗口中打开,该窗口不是我的主窗口所属的MDI容器窗体的子窗口.
如何通过单击我的WebBrowser中的链接创建任何和所有弹出窗口作为我的MDI容器的子项(类似于设置窗体的MDIParent属性)?
提前致谢.
Han*_*ant 25
Web浏览器控件支持NewWindow事件以获得有关弹出窗口的通知.但是,Winforms包装器不会让你做很多事情,你只能取消弹出窗口.本机COM包装器允许传回Web浏览器的新实例,然后该实例将用于显示弹出窗口.
利用这一点需要一些工作.对于初学者,使用Project + Add Reference,Browse选项卡并选择c:\ windows\system32\shdocvw.dll.这增加了对本机COM接口的引用.
创建一个充当弹出窗体的表单.删除WebBrowser并使其代码看起来类似于:
public partial class Form2 : Form {
public Form2() {
InitializeComponent();
}
public WebBrowser Browser {
get { return webBrowser1; }
}
}
Run Code Online (Sandbox Code Playgroud)
Browser属性提供对将用于在弹出窗口中显示网页的浏览器的访问.
现在回到主要表格.删除WebBrowser并使其代码如下所示:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
webBrowser1.Url = new Uri("http://google.com");
}
SHDocVw.WebBrowser nativeBrowser;
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
nativeBrowser = (SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;
nativeBrowser.NewWindow2 += nativeBrowser_NewWindow2;
}
protected override void OnFormClosing(FormClosingEventArgs e) {
nativeBrowser.NewWindow2 -= nativeBrowser_NewWindow2;
base.OnFormClosing(e);
}
void nativeBrowser_NewWindow2(ref object ppDisp, ref bool Cancel) {
var popup = new Form2();
popup.Show(this);
ppDisp = popup.Browser.ActiveXInstance;
}
}
Run Code Online (Sandbox Code Playgroud)
OnLoad方法获取对本机COM接口的引用,然后将事件处理程序订阅到NewWindow2事件.我确保在FormClosing事件处理程序中取消订阅该事件,而不是100%确定是否有必要.更安全然后抱歉.
NewWindow2事件处理程序是关键,请注意第一个参数允许传回一个无类型的引用.那应该是弹出窗口中的本机浏览器.所以我创建了一个Form2实例和Show()它.注意Show()的参数,它确保弹出窗口是一个拥有的窗口.根据您的应用需要替换它,我假设您想在您的情况下创建一个MDI子窗口.
请注意,当Javascript使用alert()时,此事件不会触发显示的窗口.浏览器不会将该窗口视为HTML弹出窗口,也不会使用浏览器窗口显示它,因此您无法拦截或替换它.
| 归档时间: |
|
| 查看次数: |
21599 次 |
| 最近记录: |