J'ai une application WinForms dans laquelle j'ai hébergé une page Web à l'intérieur d'un WebBrowser contrôle.
Le contenu de la page Web est le suivant: p>
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); }
3 Réponses :
Si vous êtes heureux d'exécuter prématurément le code d'événement (qui pourrait être n'importe quoi), les suivants capture la chaîne pour moi dans votre window.load code>;
ihtmlwindow2.onbeforeunload ne présente pas elle-même la boîte de dialogue. Il renvoie simplement une chaîne que l'hôte doit ensuite utiliser dans une boîte de message. Étant donné que votre application WinForms est l'hôte, il doit utiliser MessageBox.Show (). Appeler Onbeforeunload est difficile, c'est un pointeur IDISPATCH dont le membre par défaut (DISPID 0) renvoie la chaîne. Ajoutez une référence à Vous l'utiliserez comme suit: P> < Pré> xxx pré> p> C: \ windows \ system32 \ stdole2.tlb code> et coller ce code:
Wow, cela a l'air extrêmement prometteur. Excellente réponse. Merci beaucoup. C'est juste que j'obtiens hr = -2147024809 code> après le
appeler code> appel. Je cours sur Windows 7 x64 bit. Cela peut-il avoir une certaine influence? Impossible de tester x86 en ce moment, ce qui sera la cible finale de mon application. Utilisez actuellement le profil client .NET 4.0 avec IE9 installé. Est-il possible d'obtenir des informations d'erreur plus détaillées?
J'ai testé cela sur Win7 x64. Le code d'erreur signifie "argument invalide", c'est une erreur Windows, pas une erreur COM. Je ne sais pas ce qui l'a causé. Le seul peut-être est 1033, l'ID de langue pour nous anglais. Vous n'êtes pas anglais. Essayez la cultureinfo.lcid à la place.
Je suis sur une locale en US. CultureInfo.CurrentCulture.LCID = 1033 CODE>. Si je fais
messagebox.show (nouvelle Win32Exception (marshal.getlastwin32Error ()). Message); Code> Juste après l'appel d'appel, il affiche: l'opération terminée avec succès, donc je suppose que ce n'est pas une erreur Win32.
Ok, j'ai réussi à faire fonctionner votre solution. Je viens d'utiliser une autre signature de Pinvoke pour l'interface Idispatch. Mettra à jour ma réponse et montrera-la dans une seconde. En attendant, j'accepte votre excellente réponse. Merci encore une fois pour la grande direction que tu m'as donné.
Je viens de traiter un problème similaire. C'est une réponse tardive, mais j'espère que cela peut aider quelqu'un. La solution est basée sur Cet article MSKB . Il fonctionne également pour les cas lorsque la page Web gère ONBEFOREUnload événement via Le code ci-dessus est pour la version WinForms de attachevent code> ou
addEventListener code>.
WebBrowser < / code> contrôle. Pour la version WPF,
ActiveXInstance code> doit être obtenu pour la première fois via la réflexion: p>
Ne comptez jamais sur
window.onbeforeunload () code>, ils ne travailleront jamais sous le navigateur d'opéra. Juste un pourboire.
@ sh4nx0r, je m'en fiche de l'opéra. J'utilise un contrôle WebBrowser hébergé dans une application WinForms. Cela implique Internet Explorer.
Apparemment, 'Execscript' renvoie toujours NULL: S Utile que je sais. Tout ce que je peux penser, c'est que vous lancez votre propre analyseur très élémentaire qui scindre le résultat de «Bu» par des citations simples et saisissez le premier élément du tableau de chaînes rétroductielles; comme je l'ai dit très très basique;)
@Kevritchie, non, je voudrais Ne jamais rouler mon propre analyseur . Ce serait fou. Comme je l'ai dit, s'il n'y a pas de solution indigène, j'utiliserais simplement un analyseur JavaScript tiers en tant que complexe final.
@Darindimitrov bel article. C'est une honte qu'il n'y a pas de soutien natif pour cela :(
@Kevritchie, s'avère, il y a un soutien natif. Merci à Hans Passant qui a partagé ses connaissances.