HTML Code in die Zwischenablage kopieren (mit Format)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von jan99.

    HTML Code in die Zwischenablage kopieren (mit Format)

    Hallo,
    ich habe in meiner Anwendung einen Webbrowser der einen HTML-Code aus einem String anzeigt. Der Code wird im WebBrowser wie folgt angezeigt: Testzeile

    VB.NET-Quellcode

    1. Dim html As String
    2. html = "<b>Testzeile</b>"
    3. WebBrowser1.DocumentText = html"


    Nun möchte ich diesen HTML-Code in die Zwischenablage kopieren um diesen bei Word oder Expression Web in der visuellen Ansicht einzufügen. Ich habe schon einiges erfolglos probiert.

    Mit folgender Methode kopiert, wird der HTML-Code als "<b>Testzeile</b>" angezeigt

    VB.NET-Quellcode

    1. Clipboard.SetText(WebBrowser1.DocumentText)


    Mit folgender Methode kopiert, wird der HTML-Code gar nicht angezeigt, die Zwischenablage ist leer.

    VB.NET-Quellcode

    1. Clipboard.SetText(WebBrowser1.DocumentText, TextDataFormat.Html)


    Folgende Kopier-Methode liefert zwar das gewünschte Ergebnis.

    VB.NET-Quellcode

    1. WebBrowser1.Focus()
    2. SendKeys.SendWait("^a")
    3. SendKeys.SendWait("^c")

    Das Problem ist aber, dass dieser Code zu einem Problem mit den im Projekt eingefügten HotKey/Shortcut führt.

    Falls es hilft, ist mein HotKey/Shortcut wie folgt programmiert:

    VB.NET-Quellcode

    1. Public Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. If e.Control And e.KeyCode = Keys.R And Button3.Enabled = True Then
    3. e.Handled = False
    4. Form2.Show()
    5. End If
    6. End Sub


    Hat jemand vielleicht eine Idee wie ich mein Vorhaben noch realisieren kann?
    Oder vielleicht, wie ich den Konflikt zwischen dem Kopieren und dem HotKey/Shortcut lösen könnten?

    Vielen Dank im Vorraus
    Hallo!

    Mit dem Zwischenablageformat sollte es funktionieren. Du musst einen Verweis auf die "Microsoft Forms 2.0 Object Libray" setzen. Beispiel in VBA geschrieben.

    Visual Basic-Quellcode

    1. Public Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
    2. Public Sub HTMLInZwischenablage(htmltext As String)
    3. Dim nCFHTML As Long
    4. Dim nClipboardText As String
    5. htmltext = Replace(htmltext, "&#10;", vbLf) '&#13;
    6. nCFHTML = RegisterClipboardFormat("HTML Format")
    7. nClipboardText = "Version:0.9" & vbCrLf
    8. nClipboardText = nClipboardText & "StartHTML:-1" & vbCrLf
    9. nClipboardText = nClipboardText & "EndHTML:-1" & vbCrLf
    10. nClipboardText = nClipboardText & "StartFragment:000081" & vbCrLf
    11. nClipboardText = nClipboardText & "EndFragment:°°°°°°" & vbCrLf
    12. nClipboardText = nClipboardText & htmltext & vbCrLf
    13. nClipboardText = Replace(nClipboardText, "°°°°°°", _
    14. Format$(Len(nClipboardText), "000000"))
    15. With New DataObject
    16. .Clear
    17. .SetText StrConv(nClipboardText, vbFromUnicode), nCFHTML
    18. .PutInClipboard
    19. End With
    20. End Sub
    21. Sub Test_A()
    22. HTMLInZwischenablage ("<a href='http:/www.seite.de'>Hier klicken</a>")
    23. End Sub


    Gruß, René
    @max1605
    @mumpel Unter Verwendung von .NET und ohne RegisterClipboardFormat() sieht Dein Code so aus:

    VB.NET-Quellcode

    1. Public Sub HTMLInZwischenablage(htmltext As String)
    2. Dim nClipboardText As String
    3. nClipboardText = "Version:0.9" & vbCrLf
    4. nClipboardText = nClipboardText & "StartHTML:-1" & vbCrLf
    5. nClipboardText = nClipboardText & "EndHTML:-1" & vbCrLf
    6. nClipboardText = nClipboardText & "StartFragment:000081" & vbCrLf
    7. nClipboardText = nClipboardText & "EndFragment:°°°°°°" & vbCrLf
    8. nClipboardText = nClipboardText & htmltext & vbCrLf
    9. nClipboardText = nClipboardText.Replace("°°°°°°", nClipboardText.Length.ToString("000000"))
    10. Dim data = New DataObject
    11. data.SetText(nClipboardText, TextDataFormat.Html)
    12. Clipboard.SetDataObject(data)
    13. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Vielen Dank. Dieser Code hat mich auf jeden Fall weitergebracht, aber beim Einfügen in die grafische Oberfläche von Expression Web wird vor dem richtig formatierten HTML-Code noch folgendes angezeigt:
    "Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:000081 EndFragment:000215" Wie bekomme ich das weg?

    Und zum Code habe ich noch eine Anmerkung.
    Ich muss htmltext neben nClipboardText deklarieren, sonst kann ich nicht in ein Button Click Event auf diesen Sub verweisen.

    VB.NET-Quellcode

    1. Public Sub HTMLInZwischenablage()
    2. Dim nClipboardText , htmltext As String


    VG
    Die Variable htmlText ist bereits hier deklariert Public Sub HTMLInZwischenablage(htmltext As String). In dem Snippet wird eine Varibale vom Typ String erstellt. Anschließend wird diese Variable gefüllt mit nClipboardText = "Version:0.9" & vbCrLf..., vbCrLf steht für 'Courage line feed' also ein Zeilenumbruch.

    In nClipboardText wird also mit nClipboardText = "Version:0.9" & vbCrLf der Text Version:0.9 + ein Zeilenumbruch geschrieben. Mit nClipboardText = nClipboardText & htmltext wird der eigentliche Quellcode der Website zu dem String hinzugefügt. Das heisst du müsstest nur

    VB.NET-Quellcode

    1. Dim nClipboardText As String
    2. nClipboardText = htmltext

    schreiben. Spätestens hier kann man erkennen das man das Snippet wesentlich übersichtlicher gestalten kann. Da du der Methode HTMLInZwischenablage einen string übergeben musst benötigt man die deklaration von nClipboardText genau genommen garnicht. Denn du kannst die variable htmltext gleich in die Zwischenablage schreiben.

    VB.NET-Quellcode

    1. Public Sub HTMLInZwischenablage(htmltext As String)
    2. Dim data = New DataObject
    3. data.SetText(htmltext, TextDataFormat.Html)
    4. Clipboard.SetDataObject(data)
    5. End Sub
    Vielen Dank für die Antwort.
    Leider kann ich den Code nur nicht ausprobieren.
    Solange htmltext in den Klammern hinter HTMLinZwischenablage deklariert wird, kann ich auf den Sub nicht zugreifen.

    Beispielsweise wird hier der Sub rot unterlegt und ich kann nicht debuggen.

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    2. HTMLinZwischenablage()
    3. End Sub


    Auch hier wird der Sub rot unterlegt:

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    2. HTMLinZwischenablage(htmltext As String)
    3. End Sub


    Und so kann ich auch nicht debuggen:

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs, htmltext As String) Handles Button4.Click
    2. HTMLinZwischenablage()
    3. End Sub


    Und wieder komme ich beim Problem von meinem Post Nr. 4

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs, htmltext As String) Handles Button4.Click
    2. Dim htmltext As String = 'Der Quellcode
    3. HTMLinZwischenablage(htmltext)
    4. End Sub


    Woher bekommst du denn den Quellcode?
    Der HTML-Quellcode ist einweder in einem String oder in einem Webbrowser (Webbrowser.DocumentText)

    Ich habe mal versucht den Code zum Button4_Click auszuprobieren, jedoch kann ich den nicht debuggen. das Click am Ende wird rot unterlegt.
    Entferne ich htmltext As String aus dem Klammen beim Private Sub Button4_Click, kann ich zwar debuggen, jedoch wird immernoch "Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:000081 EndFragment:000215" vor dem eigentlichen Code angezeigt.

    Und was ich ganz vergessen haben zu sagen.
    Ich verwende das HTMLinZwischenablage von @RodFromGermany.
    Wenn ich das HTMLinZwischenablage von @Fakiz debugge, passiert leider nichts (dabei ist der Code schon wesentlich kompakter).

    Ich fasse mal zusammen was ich habe.
    LinkausgabeNormal ist mein Webbrowser, der einen HTML-Code visuell anzeigt.
    Wenn ich auf Button4 klicke, möchte ich, dass der Inhalt von LinkausgabeNormal kopiert wird und dann in der Visuellen Ansicht bspw. von Expression Web genauso angezeigt wird, wie im Webbrowser LinkausgabeNormal.
    Hierzu habe ich nun folgendn Code:

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    2. Dim htmltext As String = LinkausgabeNormal.DocumentText
    3. HTMLinZwischenablage(htmltext)
    4. End Sub
    5. Public Sub HTMLinZwischenablage(htmltext As String)
    6. Dim nClipboardText As String
    7. nClipboardText = htmltext
    8. nClipboardText = "Version:0.9" & vbCrLf
    9. nClipboardText = nClipboardText & "StartHTML:-1" & vbCrLf
    10. nClipboardText = nClipboardText & "EndHTML:-1" & vbCrLf
    11. nClipboardText = nClipboardText & "StartFragment:000081" & vbCrLf
    12. nClipboardText = nClipboardText & "EndFragment:°°°°°°" & vbCrLf
    13. nClipboardText = nClipboardText & htmltext & vbCrLf
    14. nClipboardText = nClipboardText.Replace("°°°°°°", nClipboardText.Length.ToString("000000"))
    15. Dim data = New DataObject
    16. data.SetText(nClipboardText, TextDataFormat.Html)
    17. Clipboard.SetDataObject(data)
    18. End Sub


    Und wie gesagt, wenn ich das kopierte bei Expression Web einfüge, steht vor dem richtig dargestellten HTML-Code immernoch "Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:000081 EndFragment:000215"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „max1605“ ()

    Lies dir diesen Beitrag nochmal ganz in Ruhe durch, das steht die Lösung deines Problems. ;)
    Wichtig ist, daß du code auch verstehst, den mit Copy&Paste kommt man nicht weit !

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    2. Dim data = New DataObject
    3. data.SetText(LinkausgabeNormal.DocumentText, TextDataFormat.Html)
    4. Clipboard.SetDataObject(data)
    5. End Sub


    *Edit*
    [vbnet]
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    Clipboard.SetText(LinkausgabeNormal.DocumentText, TextDataFormat.Html)
    End Sub
    [/vbnet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()

    Fakiz schrieb:

    In nClipboardText wird also mit nClipboardText = "Version:0.9" & vbCrLf der Text Version:0.9 + ein Zeilenumbruch geschrieben. Mit nClipboardText = nClipboardText & htmltext wird der eigentliche Quellcode der Website zu dem String hinzugefügt. Das heisst du müsstest nur

    VB.NET-Quellcode

    1. Dim nClipboardText As String
    2. nClipboardText = htmltext

    ;)

    Clipboard.SetText(htmltext, TextDataFormat.Html) funktioniert tatsächlich nicht, Clipboard.SetText(htmltext) aber schon.
    Wieso, weshalb, warum, weiß ich auch nicht, die Clipboard Klasse ist mir schleierhaft, selbst die von MS genanten Beispiele, funktionieren bei mir nicht.
    Ich habe jetzt mal wieder meine Code genommen und ausprobiert:

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    2. Dim htmltext As String = LinkausgabeNormal.DocumentText
    3. HTMLinZwischenablage(htmltext)
    4. End Sub
    5. Public Sub HTMLinZwischenablage(htmltext As String)
    6. Dim nClipboardText As String
    7. nClipboardText = htmltext
    8. nClipboardText = "Version:0.9" & vbCrLf
    9. nClipboardText = nClipboardText & "StartHTML:-1" & vbCrLf
    10. nClipboardText = nClipboardText & "EndHTML:-1" & vbCrLf
    11. nClipboardText = nClipboardText & "StartFragment:000081" & vbCrLf
    12. nClipboardText = nClipboardText & "EndFragment:°°°°°°" & vbCrLf
    13. nClipboardText = nClipboardText & htmltext & vbCrLf
    14. nClipboardText = nClipboardText.Replace("°°°°°°", nClipboardText.Length.ToString("000000"))
    15. Dim data = New DataObject
    16. data.SetText(nClipboardText, TextDataFormat.Html)
    17. Clipboard.SetDataObject(data)
    18. End Sub


    Wenn ich das so stehen habe:

    VB.NET-Quellcode

    1. data.SetText(nClipboardText, TextDataFormat.Html)

    dann kommt "Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:000081 EndFragment:000215" vor dem richtig formatierten HTML-Code (HTML-Code kommt aus den Webbrowser "LinkauasgabeNormal")in einer Zeile.

    Wenn ich TextDataFormat entferne:

    VB.NET-Quellcode

    1. data.SetText(nClipboardText)

    dann wird "Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:000081 EndFragment:000215" in Zeilen aufgeteilt (gemäß der vbCrLf Anweisung) und in der letzten Zeile steht der HTML-Code als reiner Code ohne Formatierung da.

    Kann denn in meinem Code denn sonst wo noch ein Fehler sein? Ich finde da leider nichts :/