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
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:
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):
und dann habe ich das Closing-Ereignis des Formulars abonniert und konnte die vom onbeforeunload
-Ereignis zurückgegebene Nachricht abrufen und den Benutzer auffordern:
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:
Sie werden es so verwenden:
%Vor% 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
.
Der obige Code ist für die WinForms-Version von WebBrowser
control. Für die WPF-Version sollte ActiveXInstance
zuerst durch Reflektion erhalten werden:
Tags und Links c# winforms browser onbeforeunload