Wie kann das onbeforeunload-Ereignis in einem WebBrowser-Steuerelement abgefangen werden?

8

Ich habe eine WinForms-Anwendung, in der ich eine Webseite innerhalb eines gehostet habe WebBrowser Kontrolle.

Der Inhalt der Webseite ist der folgende:

%Vor%

Wie Sie sehen können, habe ich die onbeforeunload Ereignis, das erlaubt, einen Bestätigungsdialog zu zeigen, bevor man von dieser Seite weg navigiert. Das funktioniert gut, wenn ich auf den Anker klicke, der die Seite neu lädt. Das Bestätigungsfeld wird angezeigt und der Benutzer kann das erneute Laden der Seite abbrechen. Dies funktioniert in dem von WinForms gehosteten Steuerelement einwandfrei.

Nun habe ich Schwierigkeiten mit dem Abfangen und Ausführen dieses Ereignisses, wenn der Benutzer die WinForms-Anwendung schließt (indem er beispielsweise auf die X-Schaltfläche klickt).

Ich kann den Inhalt dieser Funktion in der WinForms-Anwendung abrufen, aber egal, was ich versucht habe, konnte ich den Inhalt der von dieser Funktion zurückgegebenen Zeichenfolge nicht abrufen, damit ich sie später zum Nachstellen einer MessageBox verwenden kann wenn der Benutzer versucht, die Anwendung zu schließen:

%Vor%

Ich habe versucht, die Methode window.execScript zu verwenden nicht verfügbar:

%Vor%

Ich habe auch Folgendes versucht, aber es hat auch null zurückgegeben:

%Vor%

Als letzten Ausweg könnte ich einen Javascript-Parser eines Drittanbieters verwenden, dem ich den Körper dieser Funktion zuführen kann, und er wird ihn ausführen und mir den Rückgabewert geben, aber das wäre wirklich ein letzter Ausweg. Ich würde mich freuen, wenn es eine nativere Möglichkeit geben würde, dies mit der MSHTML-Bibliothek von Microsoft zu tun.

UPDATE:

Dies ist jetzt dank der ausgezeichneten Antwort , die @Hans zur Verfügung gestellt hat, gelöst. Aus irgendeinem Grund konnte ich seine Lösung nicht auf meinem Testgerät arbeiten lassen (Win7 x64, .NET 4.0 Client Profil, IE9, en-US locale) und bekam immer hr = -2147024809 nach dem IDispatch.Invoke Aufruf. Also habe ich die IDispatch P / Invoke-Signatur folgendermaßen geändert (diese Signatur benötigt keinen Verweis auf c:\windows\system32\stdole2.tlb , der dem Projekt hinzugefügt werden soll):

%Vor%

und dann habe ich das Closing-Ereignis des Formulars abonniert und konnte die vom onbeforeunload -Ereignis zurückgegebene Nachricht abrufen und den Benutzer auffordern:

%Vor%     
Darin Dimitrov 16.01.2012, 16:31
quelle

3 Antworten

10

IHtmlWindow2.onbeforeunload zeigt das Dialogfeld nicht selbst an. Es gibt nur eine Zeichenfolge zurück, die der Host dann in einer Nachrichtenbox verwenden muss. Da Ihre Winforms-App der Host ist, muss sie MessageBox.Show () verwenden. Der Aufruf von onforefeunload ist schwierig, da es sich um einen IDispatch-Zeiger handelt, dessen Standardmember (dispid 0) die Zeichenfolge zurückgibt. Fügen Sie einen Verweis auf c:\windows\system32\stdole2.tlb hinzu und fügen Sie diesen Code ein:

%Vor%

Sie werden es so verwenden:

%Vor%     
Hans Passant 16.01.2012, 19:43
quelle
3

Ich habe mich gerade mit einem ähnlichen Problem beschäftigt. Dies ist eine späte Antwort, aber hoffentlich kann es jemandem helfen. Die Lösung basiert auf diesem MSKB-Artikel . Es funktioniert auch in Fällen, in denen die Webseite onbeforeunload verarbeitet > Ereignis über attachEvent oder addEventListener .

%Vor%

Der obige Code ist für die WinForms-Version von WebBrowser control. Für die WPF-Version sollte ActiveXInstance zuerst durch Reflektion erhalten werden:

%Vor%     
Noseratio 16.09.2013 04:14
quelle
1

Wenn Sie den Ereigniscode vorzeitig ausführen möchten (was irgendwas sein könnte), fängt der folgende Code die Zeichenfolge für mich in Ihrem Window.Load ;

%Vor%     
Alex K. 16.01.2012 17:57
quelle