मेरे पास एक WinForms एप्लिकेशन है जिसमें मैंने WebBrowser नियंत्रण के अंदर एक वेब पेज होस्ट किया है।वेबब्राउज़र नियंत्रण में ऑनबर्ननलोड ईवेंट को कैसे रोकें?
वेब पृष्ठ की सामग्री निम्नलिखित है:
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<title>onbeforeunload test</title>
<meta charset="utf-8">
</head>
<body>
<a href="#" onclick="window.location.reload();">Test</a>
<script type="text/javascript">
window.onbeforeunload = function() {
return 'Are you sure you want to leave this page?';
};
</script>
</body>
</html>
आप देख सकते हैं मैं onbeforeunload
घटना है जो इस पेज से नेविगेट करने से पहले एक पुष्टिकरण संवाद दिखा सकता है, की सदस्यता ली है। यह ठीक काम करता है जब मैं एंकर पर क्लिक करता हूं जो पृष्ठ को पुनः लोड करता है। पुष्टिकरण बॉक्स दिखाया गया है और उपयोगकर्ता पृष्ठ के पुनः लोड को रद्द कर सकता है। यह WinForms होस्टेड नियंत्रण के अंदर ठीक काम करता है।
अब, मुझे इस समस्या को रोकना और निष्पादित करना है जब उपयोगकर्ता WinForms एप्लिकेशन को बंद करता है (उदाहरण के लिए एक्स बटन पर क्लिक करके)।
मैं WinForms एप्लिकेशन में इस फ़ंक्शन की सामग्री लाने में सक्षम हूं लेकिन इससे कोई फर्क नहीं पड़ता कि मैंने कोशिश की कि मैं इस स्ट्रिंग की स्ट्रिंग की सामग्री प्राप्त नहीं कर पा रहा हूं ताकि मैं इसे बाद में नकली में उपयोग कर सकूं।
webBrowser1.Navigated += (sender, e) =>
{
webBrowser1.Document.Window.Load += (s, ee) =>
{
// In order to get the IHTMLWindow2 interface I have referenced
// the Microsoft HTML Object Library (MSHTML) COM control
var window = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
// the bu variable contains the script of the onbeforeunload event
var bu = window.onbeforeunload();
// How to get the string that is returned by this function
// so that I can subscribe to the Close event of the WinForms application
// and show a fake MessageBox with the same text?
};
};
webBrowser1.Navigate("file:///c:/index.htm");
मुझे कोई उपलब्ध करने के लिए window.execScript
विधि की कोशिश की है: MessageBox जब उपयोगकर्ता अनुप्रयोग को बंद करने का प्रयास करता
// returns null
var script = string.Format("({0})();", bu);
var result = window.execScript(script, "javascript");
मैं भी कोशिश की है निम्नलिखित लेकिन यह भी अशक्त लौट आए:
01,235,var result = window.execScript("(function() { return 'foo'; })();", "javascript");
अंतिम उपाय के रूप में मैं एक तृतीय पक्ष जावास्क्रिप्ट पार्सर का उपयोग कर सकता हूं जिसके लिए मैं इस समारोह के शरीर को खिला सकता हूं और यह इसे निष्पादित करेगा और मुझे वापसी मूल्य देगा लेकिन यह वास्तव में अंतिम उपाय होगा। माइक्रोसॉफ्ट की एमएसएचटीएमएल लाइब्रेरी का उपयोग करके ऐसा करने का एक और मूल तरीका होने पर मुझे खुशी होगी।
अद्यतन:
यह अब excellent answer कि @Hans प्रदान की करने के लिए धन्यवाद हल किया जाता है। किसी कारण से मैं अपनी टेस्ट मशीन (विन 7 एक्स 64, .NET 4.0 क्लाइंट प्रोफाइल, आईई 9, एन-यूएस लोकेल) पर अपना समाधान काम नहीं कर सका और IDispatch.Invoke
कॉल के बाद मुझे हमेशा hr = -2147024809
मिल रहा था। तो मैं निम्नलिखित करने के लिए IDispatch पी/आह्वान हस्ताक्षर को संशोधित किया है (इस हस्ताक्षर c:\windows\system32\stdole2.tlb
के लिए एक संदर्भ की आवश्यकता नहीं है परियोजना के लिए जोड़ा जा करने के लिए):
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("00020400-0000-0000-C000-000000000046")]
public interface IDispatch
{
[PreserveSig]
int GetTypeInfoCount(out int Count);
[PreserveSig]
int GetTypeInfo(
[MarshalAs(UnmanagedType.U4)] int iTInfo,
[MarshalAs(UnmanagedType.U4)] int lcid,
out ITypeInfo typeInfo
);
[PreserveSig]
int GetIDsOfNames(
ref Guid riid,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] rgsNames,
int cNames,
int lcid,
[MarshalAs(UnmanagedType.LPArray)] int[] rgDispId
);
[PreserveSig]
int Invoke(
int dispIdMember,
ref Guid riid,
uint lcid,
ushort wFlags,
ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
out object pVarResult,
ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
IntPtr[] pArgErr
);
}
और फिर मैं के समापन घटना की सदस्यता ली है फार्म और संदेश onbeforeunload
घटना द्वारा वापस लाने के लिए कर रहा था और के लिए संकेत करें:
protected override void OnFormClosing(FormClosingEventArgs e)
{
var window = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
var args = new System.Runtime.InteropServices.ComTypes.DISPPARAMS();
var result = new object();
var except = new System.Runtime.InteropServices.ComTypes.EXCEPINFO();
var idisp = window.onbeforeunload as IDispatch;
if (idisp != null)
{
var iid = Guid.Empty;
var lcid = (uint)CultureInfo.CurrentCulture.LCID;
int hr = idisp.Invoke(0, ref iid, lcid, 1, ref args, out result, ref except, null);
if (hr == 0)
{
var msgBox = MessageBox.Show(
this,
(string)result,
"Confirm",
MessageBoxButtons.OKCancel
);
e.Cancel = msgBox == DialogResult.Cancel;
}
}
base.OnFormClosing(e);
}
कभी 'window.onbeforeunload पर भरोसा करते हैं()', वे कभी ओपेरा ब्राउज़र के तहत काम कभी नहीं होगा। बस एक टिप। –
@ sh4nx0r, मुझे ओपेरा के बारे में परवाह नहीं है। मैं WinForms एप्लिकेशन में होस्ट किए गए वेबब्रोसर नियंत्रण का उपयोग कर रहा हूं। यह इंटरनेट एक्सप्लोरर का तात्पर्य है। –
जाहिर है 'execScript' हमेशा शून्य वापस आ जाएगा: एस मददगार मुझे पता है। मैं सोच सकता हूं कि आप अपना खुद का बहुत ही बुनियादी पार्सर रोल करते हैं जो सिंगल कोट्स द्वारा 'bu' के परिणाम को विभाजित करता है और पहले आइटम को पुनर्प्राप्त स्ट्रिंग सरणी में ले जाता है; जैसे मैंने बहुत ही बुनियादी कहा;) –