Word-Text formatiert in die Zwischenablage

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    Word-Text formatiert in die Zwischenablage

    Hallo zusammen,

    folgende Frage:
    Wie kann man bewerkstelligen, dass wenn man von Word einen formatierten Text (nicht RTF) mit Strg+A, Strg+C in die Zwischenablage kopiert, dort auch der formatierte und kein Plain-Text ankommt. D.h., erkennt die Zwischenablage, was da ankommt??

    Grüße - Dietrich
    Wenn ich das richtig sehe, gibt es beim Clipboard die Methoden GetText() für Plain-Text und GetText(TextDataFormat) für formatierten Text, siehe learn.microsoft.com/en-us/dotn…t?view=windowsdesktop-8.0

    Und es gibt dort nur CSV, HTML, RTF und Text, somit wird das aus Word wohl RTF sein. Wobei ich da Bilder vermisse.

    Es ist auf jeden Fall immer formatiert und unformatiert in der Zwischenablage, weil Strg+V ist formatiert und Strg+Shift+V ist unformatiert.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hi Ihr, es gibt m.W. folgende ZwischenablageFormate (Beispiel aus meinem Proggi):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. If Clipboard.ContainsImage = True AndAlso (My.Settings.Import_NeueBildObjekte > 0 OrElse importArt > 0) Then
    2. ' Bild
    3. ZwischenablageFormat = 4
    4. ordnerWahl = My.Settings.DefaultOrdner_NeueBildObjekte
    5. objektWahl = My.Settings.Import_NeueBildObjekte
    6. Else
    7. If Clipboard.ContainsFileDropList = True AndAlso (My.Settings.Import_NeueDateiObjekte > 0 OrElse importArt > 0) Then
    8. ' Datei
    9. ZwischenablageFormat = 5
    10. ordnerWahl = My.Settings.DefaultOrdner_NeueDateiObjekte
    11. objektWahl = My.Settings.Import_NeueDateiObjekte
    12. Else
    13. If Clipboard.ContainsText = True Then
    14. If Clipboard.ContainsData(DataFormats.MetafilePict) = True AndAlso (My.Settings.Import_NeueRTFObjekte > 0 OrElse importArt > 0) Then
    15. ZwischenablageFormat = 2
    16. ordnerWahl = My.Settings.DefaultOrdner_NeueRTFObjekte
    17. objektWahl = My.Settings.Import_NeueRTFObjekte
    18. Else
    19. If Clipboard.ContainsText(TextDataFormat.Rtf) = True AndAlso (My.Settings.Import_NeueRTFObjekte > 0 OrElse importArt > 0) Then
    20. ' RTF
    21. ZwischenablageFormat = 2
    22. ordnerWahl = My.Settings.DefaultOrdner_NeueRTFObjekte
    23. objektWahl = My.Settings.Import_NeueRTFObjekte
    24. Else
    25. If Clipboard.ContainsText(TextDataFormat.Html) = True AndAlso (My.Settings.Import_NeueHTMLObjekte > 0 OrElse importArt > 0) Then
    26. ' HTML
    27. ZwischenablageFormat = 3
    28. ordnerWahl = My.Settings.DefaultOrdner_NeueHTMLObjekte
    29. objektWahl = My.Settings.Import_NeueHTMLObjekte
    30. Else
    31. If Clipboard.ContainsText(TextDataFormat.UnicodeText) = True AndAlso (My.Settings.Import_NeueTextObjekte > 0 OrElse importArt > 0) Then
    32. ' Unicode-Text
    33. ZwischenablageFormat = 1
    34. ordnerWahl = My.Settings.DefaultOrdner_NeueTextObjekte
    35. objektWahl = My.Settings.Import_NeueTextObjekte
    36. Else
    37. If Clipboard.ContainsText(TextDataFormat.Text) = True AndAlso (My.Settings.Import_NeueTextObjekte > 0 OrElse importArt > 0) Then
    38. ' Text
    39. ZwischenablageFormat = 0
    40. ordnerWahl = My.Settings.DefaultOrdner_NeueTextObjekte
    41. objektWahl = My.Settings.Import_NeueTextObjekte
    42. End If
    43. End If
    44. End If
    45. End If
    46. End If
    47. End If
    48. End If
    49. End If



    Und speichern des Clipboard-Inhaltes (Beispiel aus meinem Proggi):
    Spoiler anzeigen

    Quellcode

    1. Select Case ZwischenablageFormat
    2. Case = 5
    3. ' Datei(en) / Ordner
    4. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileName(Clipboard.GetFileDropList(0)))
    5. ergebnis = DateienImICEKopieren(Clipboard.GetFileDropList(), IO.Path.Combine(dOrdner, nName), 2, My.Resources.ICE_Main_ObjektAusZwischenablage_Info0, My.Resources.ICE_Main_ObjektAusZwischenablage_Info1, False, False)
    6. If ergebnis = 0 Then
    7. If manuellerImport = True Then
    8. Statistik_ObjekteManuellAusClipboard += Clipboard.GetFileDropList.Count
    9. Else
    10. Statistik_ObjekteAutomatischAusClipboard += Clipboard.GetFileDropList.Count
    11. End If
    12. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_Datei & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    13. Else
    14. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_Datei & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    15. End If
    16. Case = 4
    17. ' Bild
    18. Dim bildObjekt As New PictureBox
    19. dName = IO.Path.Combine(dOrdner, dName & "." & My.Settings.Import_BildFormat)
    20. nName = dName
    21. ' Objekt schon vorhanden?
    22. If IO.File.Exists(dName) = True Then
    23. vara = 1
    24. Do
    25. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(nName) & " (" & vara & ")" & "." & My.Settings.PicEditor_SpeichernBildFormat)
    26. vara += 1
    27. Loop While IO.File.Exists(dName) = True
    28. End If
    29. bildObjekt.Image = Clipboard.GetImage
    30. returnfehler = BildObjekt_Speichern(bildObjekt, dName, My.Settings.Import_JPGQualität)
    31. If returnfehler = False Then
    32. If manuellerImport = True Then
    33. Statistik_ObjekteManuellAusClipboard += 1
    34. Else
    35. Statistik_ObjekteAutomatischAusClipboard += 1
    36. End If
    37. form_Einstellungen.UpdateStatistik()
    38. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_Bild & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    39. Else
    40. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_Bild & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    41. End If
    42. Case = 3
    43. ' HTML
    44. Select Case My.Settings.Import_HTMLalsXImportieren
    45. Case 0
    46. ' als HTML
    47. Dim htmlObjekt As New WebBrowser
    48. vara = 0
    49. Do Until htmlObjekt.ReadyState = WebBrowserReadyState.Complete Or vara > 20000
    50. vara += 1
    51. System.Windows.Forms.Application.DoEvents()
    52. Loop
    53. dName = IO.Path.Combine(dOrdner, dName & ".html")
    54. Dim html As String = Clipboard.GetText(TextDataFormat.Html)
    55. HtmlUmformatieren(html, dName)
    56. htmlObjekt.DocumentText = html
    57. vara = 0
    58. Do Until htmlObjekt.ReadyState = WebBrowserReadyState.Complete Or vara > 20000
    59. vara += 1
    60. System.Windows.Forms.Application.DoEvents()
    61. Loop
    62. ' Objekt schon vorhanden?
    63. nName = dName
    64. If IO.File.Exists(dName) = True Then
    65. vara = 1
    66. Do
    67. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(nName) & " (" & vara & ")" & ".html")
    68. vara += 1
    69. Loop While IO.File.Exists(dName) = True
    70. End If
    71. returnfehler = WebbrowserObjekt_Speichern(htmlObjekt, dName)
    72. If returnfehler = False Then
    73. If manuellerImport = True Then
    74. Statistik_ObjekteManuellAusClipboard += 1
    75. Else
    76. Statistik_ObjekteAutomatischAusClipboard += 1
    77. End If
    78. form_Einstellungen.UpdateStatistik()
    79. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_HTML & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    80. Else
    81. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_HTML & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    82. End If
    83. Case 1
    84. ' Als RTF
    85. Dim textObjekt As New RichTextBox
    86. Dim htmlObjekt As New WebBrowser
    87. vara = 0
    88. Do Until htmlObjekt.ReadyState = WebBrowserReadyState.Complete Or vara > 20000
    89. vara += 1
    90. System.Windows.Forms.Application.DoEvents()
    91. Loop
    92. htmlObjekt.Navigate("about:")
    93. dName = IO.Path.Combine(dOrdner, dName & ".rtf")
    94. Dim html As String = Clipboard.GetText(TextDataFormat.Html)
    95. HtmlUmformatieren(html, dName)
    96. htmlObjekt.Document.Write(html)
    97. vara = 0
    98. Do Until htmlObjekt.ReadyState = WebBrowserReadyState.Complete Or vara > 20000
    99. vara += 1
    100. System.Windows.Forms.Application.DoEvents()
    101. Loop
    102. isLoaded = False
    103. htmlObjekt.Document.ExecCommand("SelectAll", False, Nothing)
    104. htmlObjekt.Document.ExecCommand("Copy", False, Nothing)
    105. textObjekt.SelectAll()
    106. textObjekt.Paste()
    107. isLoaded = True
    108. ' Objekt schon vorhanden?
    109. nName = dName
    110. If IO.File.Exists(dName) = True Then
    111. vara = 1
    112. Do
    113. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(nName) & " (" & vara & ")" & ".rtf")
    114. vara += 1
    115. Loop While IO.File.Exists(dName) = True
    116. End If
    117. returnfehler = TextObjekt_Speichern(textObjekt, dName, TextDataFormat.Rtf)
    118. If returnfehler = False Then
    119. If manuellerImport = True Then
    120. Statistik_ObjekteManuellAusClipboard += 1
    121. Else
    122. Statistik_ObjekteAutomatischAusClipboard += 1
    123. End If
    124. form_Einstellungen.UpdateStatistik()
    125. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_HTMLAlsRTF & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    126. Else
    127. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_HTMLAlsRTF & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    128. End If
    129. Case 2
    130. ' Als Text
    131. dName = IO.Path.Combine(dOrdner, dName & ".txt")
    132. nName = dName
    133. ' Objekt schon vorhanden?
    134. If IO.File.Exists(dName) = True Then
    135. vara = 1
    136. Do
    137. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(nName) & " (" & vara & ")" & ".txt")
    138. vara += 1
    139. Loop While IO.File.Exists(dName) = True
    140. End If
    141. returnfehler = SpeichernAddtext(dName, TextDataFormat.Text)
    142. If returnfehler = False Then
    143. If manuellerImport = True Then
    144. Statistik_ObjekteManuellAusClipboard += 1
    145. Else
    146. Statistik_ObjekteAutomatischAusClipboard += 1
    147. End If
    148. form_Einstellungen.UpdateStatistik()
    149. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_HTMLAlsText & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    150. Else
    151. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_HTMLAlsText & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    152. End If
    153. End Select
    154. Case = 2
    155. ' RTF
    156. If My.Settings.Import_RTFalsText = True Then
    157. dName = IO.Path.Combine(dOrdner, dName & ".txt")
    158. nName = dName
    159. ' Objekt schon vorhanden?
    160. If IO.File.Exists(dName) = True Then
    161. vara = 1
    162. Do
    163. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(nName) & " (" & vara & ")" & ".txt")
    164. vara += 1
    165. Loop While IO.File.Exists(dName) = True
    166. End If
    167. returnfehler = SpeichernAddtext(dName, TextDataFormat.Text)
    168. If returnfehler = False Then
    169. If manuellerImport = True Then
    170. Statistik_ObjekteManuellAusClipboard += 1
    171. Else
    172. Statistik_ObjekteAutomatischAusClipboard += 1
    173. End If
    174. form_Einstellungen.UpdateStatistik()
    175. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_RTFAlsText & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    176. Else
    177. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_RTFAlsText & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    178. End If
    179. Else
    180. dName = IO.Path.Combine(dOrdner, dName & ".rtf")
    181. nName = dName
    182. Dim textObjekt As New RichTextBox With {
    183. .Rtf = Clipboard.GetText(TextDataFormat.Rtf)
    184. }
    185. ' Objekt schon vorhanden?
    186. If IO.File.Exists(dName) = True Then
    187. vara = 1
    188. Do
    189. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(nName) & " (" & vara & ")" & ".rtf")
    190. vara += 1
    191. Loop While IO.File.Exists(dName) = True
    192. End If
    193. returnfehler = TextObjekt_Speichern(textObjekt, dName, TextDataFormat.Rtf)
    194. If returnfehler = False Then
    195. If manuellerImport = True Then
    196. Statistik_ObjekteManuellAusClipboard += 1
    197. Else
    198. Statistik_ObjekteAutomatischAusClipboard += 1
    199. End If
    200. form_Einstellungen.UpdateStatistik()
    201. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_RTF & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    202. Else
    203. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_RTF & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    204. End If
    205. End If
    206. Case = 1
    207. ' UnicodeText
    208. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(dName) & ".txt")
    209. nName = dName
    210. ' Objekt schon vorhanden?
    211. If IO.File.Exists(dName) = True Then
    212. vara = 1
    213. Do
    214. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(nName) & " (" & vara & ")" & ".txt")
    215. vara += 1
    216. Loop While IO.File.Exists(dName) = True
    217. End If
    218. returnfehler = SpeichernAddtext(dName, TextDataFormat.UnicodeText)
    219. If returnfehler = False Then
    220. If manuellerImport = True Then
    221. Statistik_ObjekteManuellAusClipboard += 1
    222. Else
    223. Statistik_ObjekteAutomatischAusClipboard += 1
    224. End If
    225. form_Einstellungen.UpdateStatistik()
    226. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_UnicodeText & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    227. Else
    228. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_UnicodeText & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    229. End If
    230. Case = 0
    231. ' Text
    232. dName = IO.Path.Combine(dOrdner, dName & ".txt")
    233. nName = dName
    234. ' Objekt schon vorhanden?
    235. If IO.File.Exists(dName) = True Then
    236. vara = 1
    237. Do
    238. dName = IO.Path.Combine(dOrdner, IO.Path.GetFileNameWithoutExtension(nName) & " (" & vara & ")" & ".txt")
    239. vara += 1
    240. Loop While IO.File.Exists(dName) = True
    241. End If
    242. returnfehler = SpeichernAddtext(dName, TextDataFormat.Text)
    243. If returnfehler = False Then
    244. If manuellerImport = True Then
    245. Statistik_ObjekteManuellAusClipboard += 1
    246. Else
    247. Statistik_ObjekteAutomatischAusClipboard += 1
    248. End If
    249. form_Einstellungen.UpdateStatistik()
    250. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_Text & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Erfolgreich, importArt)
    251. Else
    252. BalloonTip_AusZwischenablageImportiert(My.Resources.ICE_Common_Text & " - " & My.Resources.ICE_Main_ObjektAusZwischenablage_Fehlgeschlagen, importArt)
    253. End If
    254. End Select



    Also für kopierte Word-Ausschnitte gilt:
    Clipboard.ContainsData(DataFormats.MetafilePict) wenn Text und Bilder aus Word kopiert wurden
    Clipboard.ContainsText(TextDataFormat.Rtf) wenn nur formatierter Text kopiert wurde
    Speichern:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim textObjekt As New RichTextBox With {.Rtf = Clipboard.GetText(TextDataFormat.Rtf)}
    2. returnfehler = TextObjekt_Speichern(textObjekt, dName, TextDataFormat.Rtf)

    VB.NET-Quellcode

    1. Private Function TextObjekt_Speichern(textObjekt As RichTextBox, dName As String, textTyp As Integer) As Boolean
    2. Dim returnFehler As Boolean = False
    3. Dim textbox As New RichTextBox
    4. Try
    5. FileWatcherSwitch(False)
    6. Select Case textTyp
    7. Case = TextDataFormat.Text
    8. ' Text
    9. Dim tmpStr As String = textObjekt.Text
    10. Dim encodingSplit = mainformTextEncodingTXT.Split(CChar(","))
    11. textbox.Text = tmpStr
    12. IO.File.WriteAllText(dName, tmpStr, System.Text.Encoding.GetEncoding(encodingSplit(0)))
    13. Case = TextDataFormat.UnicodeText
    14. ' Text
    15. Dim tmpStr As String = textObjekt.Text
    16. Dim encodingSplit = mainformTextEncodingTXT.Split(CChar(","))
    17. textbox.Text = tmpStr
    18. IO.File.WriteAllText(dName, tmpStr, System.Text.Encoding.GetEncoding(encodingSplit(0)))
    19. Case = TextDataFormat.Rtf
    20. textbox.Rtf = textObjekt.Rtf
    21. textObjekt.SaveFile(dName, RichTextBoxStreamType.RichText)
    22. End Select
    23. FileWatcherSwitch(True)
    24. Catch ex As System.Exception
    25. Me.Cursor = Cursors.Default
    26. Dim form_exclamation As New ICE_Eingabe
    27. form_exclamation.Initialisiere(False, My.Resources.ICE_Common_ICEFehler, String.Format(My.Resources.ICE_Common_Speichern_Fehler, My.Resources.ICE_Common_TextDokument & ":", dName, ex.Message), MessageBoxButtons.OK, 4)
    28. AppWinStatusSetzen(VordergrundFensterTitel, aktivesFensterState.showCmd)
    29. returnFehler = True
    30. End Try
    31. Return returnFehler
    32. End Function



    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dideldum“ ()

    @Dideldum Wenn Du Deine Code so formatierst, kann man ihn wesentlich besser lesen:

    VB.NET-Quellcode

    1. If A Then
    2. ' ...
    3. Else If B Then
    4. ' ...
    5. Else If C Then
    6. ' ...
    7. Else If D Then
    8. ' ...
    9. End If
    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!
    Hallo zusammen, ich benutze jetzt folgenden Code:

    VB.NET-Quellcode

    1. Dim iData As IDataObject
    2. Dim Str as string
    3. ......
    4. iData = Clipboard.GetDataObject
    5. If iData.GetDataPresent(DataFormats.Rtf) Then
    6. str = Clipboard.GetData(DataFormats.Rtf)
    7. Else
    8. str = Clipboard.GetText
    9. End If

    Danke an alle für die Tipps!!
    Grüße - Dietrich
    Hi @RodFromGermany
    Danke Dir, ja, da hast recht - Dieser Codeschnipsel stammt noch aus meinen ersten Gehversuchen auf VB.net :D
    Das muss ich noch korrigieren.

    Hi @dherr
    ich kenne Dein Projekt nicht, würde aber beim Übernehmen von Word-Zwischenablagen-Inhalten unbedingt folgenden Code verwenden - Falls einmal Text und Bilder im Word kopiert werden:

    VB.NET-Quellcode

    1. ' Dim iData As IDataObject (nicht erforderliche Zuweisung)
    2. Dim Str as string
    3. ......
    4. 'iData = Clipboard.GetDataObject (nicht erforderliche Zuweisung)
    5. If Clipboard.ContainsData(DataFormats.RTF) orelse Clipboard.ContainsData(DataFormats.MetafilePict) Then
    6. str = Clipboard.GetData(DataFormats.Rtf)
    7. ElseIf Clipboard.ContainsText(TextDataFormat.Text) then
    8. str = Clipboard.GetText
    9. else
    10. ' Fehlerbehandlung weder RTF, MetafilePict oder Text
    11. endif
    12. End If


    Nicht jeder Zwischenablage-Inhalt ist RTF, MetafilePict oder Text.
    Daher würde ich in der Else-Bedingung auch prüfen, ob der Zwischenablage-Inhalt auch wirklich Text ist, Bevor ich diesen an die String-Variable str übergebe.

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