MSDN.WhiteKnight - Stack Overflow answers
Ответ на "C# - Отменить закрытие WebBrowser перехватом WM_DESTROY или WM_CLOSE"
Answer 825717
Вместо того, чтобы переопределять WM_DESTROY (которое вызывается когда уже слишком поздно), нужно переопределить функцию close на уровне JavaScript. Для этого нужно будет добавить ссылку на COM объект Microsoft HTML Object Library и воспользоваться интерфейсом IHTMLScriptElement для добавления в каждую загружаемую страницу сценария со своей функцией close. В старых версиях IE это можно сделать присваиванием
window.close = function ()...
, но в IE11 это почему-то не работает, хотя то же самое достигается просто определением своей функции close.Чтобы форма могла получать уведомления от JavaScript через вызовы window.external, нужно будет добавить к ней атрибут ComVisible и присвоить ее свойству веб браузера ObjectForScripting. Пример:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Windows.Forms; using System.Security.Permissions; using System.Runtime.InteropServices; namespace WindowsFormsTest1 { [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] [System.Runtime.InteropServices.ComVisibleAttribute(true)] public partial class Form1 : Form { public void NotifyClose() { //попытка закрытия WebBrowser... } public Form1() { InitializeComponent(); webBrowser1.ObjectForScripting = this; } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // here we override the functionality of window.close HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0]; HtmlElement scriptEl = webBrowser1.Document.CreateElement("script"); mshtml.IHTMLScriptElement element = (mshtml.IHTMLScriptElement)scriptEl.DomElement; try { element.text = "function close() { window.external.NotifyClose(); } "; head.AppendChild(scriptEl); } finally { Marshal.ReleaseComObject(element); } } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.