Hallo,
ich habe bemerkt, dass die Lösung so nicht richtig funktioniert. Z.B. kann man keinen Text im Control mehr selektieren.
Ich habe zwar versucht alle Document-Events zu implementieren, aber danach konnte man immer noch keinen Text selektieren.
Deswegen habe ich auf eine Lösung zurückgegriffen, die ich unter http://www.dotnetforums.net/t69218-20-2.html gefunden habe. (ca in der Mitte der Seite der Beitrag von vsdotnetguy, in dem man die Datei vbrevised.zip herunterladen) kann.
Ich habe im letzten Posting diesen Weg nicht beschritten, da ich ehrlich gesagt nicht verstehe, warum und wie das funktioniert.
Da in der dortigen Lösung in der Form-Klasse die mshtml.HTMLDocumentEvents2 implementiert werden, muss man alle Events auch in der Klasse unterbringen, was den Code, so finde ich, ziemlich aufbläht. In der Regel interessiert man sich ja nur für einige wenige Ereignisse.
Deswegen habe ich den Code ausgelagert in eine Klasse, die ich DocumentEventRouter genannt habe. Die Klasse implementiert einerseits die mshtml.HTMLDocumentEvents2, legt aber andererseits nur solche Events offen, die ich auch wirklich haben will.
Den Code dafür poste ich separat in einem weiteren Beitrag. Um ihn zu verwenden muss man analog zu dem oben erwähnten Beispiel vorgehen, also in der Form-Klasse System.Runtime.InteropServices implementieren.
Was die Sache mit dem Kopieren in die Zwischenablage angeht, so geht das ganz einfach mit myDoc.execCommand("Copy"), wobei myDoc ein HTMLDocumentClass-Object ist
Zur Verwendung des DocumentEventRouter
In der Dispose-Methode der Form schreibt man:
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
If cookie <> -1 Then
icp.Unadvise(cookie)
Else
cookie = -1
End If
End If
End If
MyBase.Dispose(disposing)
End Sub Im Deklarationsbereich deklariert man:
Private myDoc As mshtml.HTMLDocumentClass 'WithEvents ist hier nicht mehr
' vorhanden
Private WithEvents DocEventRouter As DocumentEventRouter 'siehe zweites
' Posting
Private cookie As Integer = -1
Private icp As UCOMIConnectionPoint Ins DocumentComplete-Ereignis des Webbrowsers kommt dann:
Private Sub AxWebBrowser1_DocumentComplete( _
ByVal sender As Object, _
ByVal e As AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent) _
Handles AxWebBrowser1.DocumentComplete
myDoc = CType(AxWebBrowser1.Document, mshtml.HTMLDocumentClass)
'Eventhandling aufheben
If cookie <> -1 Then
icp.Unadvise(cookie)
cookie = -1
Else
cookie = -1
End If
DocEventRouter = New DocumentEventRouter()
Dim icpc As UCOMIConnectionPointContainer = CType(myDoc, _
UCOMIConnectionPointContainer)
Dim g As New Guid("3050F613-98B5-11CF-BB82-00AA00BDCE0B")
icpc.FindConnectionPoint(g, icp)
icp.Advise(DocEventRouter, cookie)
End SubDas Ereignis kann dann so behandelt werden:
Private Sub DocEventRouter_Doc_ContextMenu( _
ByVal sender As Object, _
ByVal e As BrowserDocumentEventArgs) _
Handles DocEventRouter.Doc_ContextMenu
'ACHTUNG: der Event steht erst zur Verfügung, wenn das Dokument
'komplett geladen worden ist
Dim pt As Point
'Umrechnen der Mauskoordinaten des Contextmenu-Events in
' Fensterkoordinaten
'der Form auf der das Webbrowsercontrol ist
pt = PointFromHtmlEvent(e.DocEventObject)
'Nun das Kontextmenu anzeigen
mnuBrowser.Show(AxWebBrowser1.Parent, pt)
e.ReturnValue = False
End Sub Wie ich bereits erwähnte, verstehe ich die Grundlagen dieser Lösung selbst nicht richtig. Deswegen wollte ich sie ursprünglich auch nicht posten. Da ich aber nun mal den ersten Schritt, der ja in eine falsche Richtung ging, getan habe, schiebe ich das hier ohne Garantie auf 100%-ige Richtigkeit nach.
Aber in diesem Forum gibt es ja einige helle Köpfe und "diesen verdienten Männern, die mit der Gründlichkeit der Einsicht noch das Talent einer lichtvollen Darstellung (dessen ich mir eben nicht bewußt bin) so glücklich verbinden, überlasse ich meine in Ansehung der letzteren hin und wieder etwa noch mangelhafte Bearbeitung zu vollenden, denn widerlegt zu werden ist in diesem Falle keine Gefahr, wohl aber nicht verstanden zu werden." (I. Kant, Kritik der reinen Vernunft, B XLIII). |