You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何实现类似MS Word的剪贴板格式粘贴功能(附代码)

实现类似MS Word的富文本剪贴板粘贴功能(含文本与图片)

需求描述

选中网页中的文本和图片内容后,按原复制的格式粘贴到控件中,实现类似MS Word的剪贴板粘贴效果。

原代码

Private Sub Past_TxtBx_From_Cliboard_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Try
        RCSN.DetectUrls = True
        Me.Cursor = Cursors.WaitCursor
        Clipboard.GetDataObject()
        If My.Computer.Clipboard.ContainsData(DataFormats.Html) Then
            Clipboard.GetText(TextDataFormat.Html)
        ElseIf (Clipboard.ContainsText(TextDataFormat.Html)) Then
            Clipboard.GetText(TextDataFormat.Html)
        ElseIf (Clipboard.ContainsText(TextDataFormat.Text)) Then
            Clipboard.GetText(TextDataFormat.Text)
        ElseIf My.Computer.Clipboard.ContainsImage() Then
            Clipboard.GetImage()
        End If
        RCSN.Paste()
        RCSN.Select()
    Catch ex As Exception
        ShowMsg(ex.Message & CurrentStickInfo(), "InfoSysMe (Stick Note)", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2, MessageBoxOptions.ServiceNotification, False)
    Finally
        Me.Cursor = Cursors.Default
        'RCSN.DetectUrls = False
    End Try
End Sub

原代码问题分析

  1. 仅检查剪贴板格式但未将对应格式数据传递给控件,直接调用RCSN.Paste()依赖控件默认逻辑,无法保证格式保留
  2. 重复判断HTML格式,逻辑冗余
  3. 未处理文本+图片的混合内容场景

优化解决方案

以下代码针对富文本(含格式文本、图片)粘贴做了优化,优先保留原复制格式:

Private Sub Past_TxtBx_From_Cliboard_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Try
        RCSN.DetectUrls = True
        Me.Cursor = Cursors.WaitCursor
        Dim dataObj As IDataObject = Clipboard.GetDataObject()

        ' 优先处理网页复制的HTML格式文本(保留原格式)
        If dataObj.GetDataPresent(DataFormats.Html) Then
            Dim htmlContent As String = dataObj.GetData(DataFormats.Html).ToString()
            ' 若使用标准RichTextBox,需将HTML转为RTF;若控件支持直接加载HTML则直接赋值
            RCSN.SelectedRtf = ConvertHtmlToRtf(htmlContent)
        ' 处理剪贴板中的图片
        ElseIf dataObj.GetDataPresent(DataFormats.Bitmap) Then
            Dim img As Image = DirectCast(dataObj.GetData(DataFormats.Bitmap), Image)
            If TypeOf RCSN Is RichTextBox Then
                DirectCast(RCSN, RichTextBox).Paste(img)
            End If
        ' 降级处理纯文本
        ElseIf dataObj.GetDataPresent(DataFormats.Text) Then
            RCSN.SelectedText = dataObj.GetData(DataFormats.Text).ToString()
        End If

        RCSN.Select()
    Catch ex As Exception
        ShowMsg(ex.Message & CurrentStickInfo(), "InfoSysMe (Stick Note)", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2, MessageBoxOptions.ServiceNotification, False)
    Finally
        Me.Cursor = Cursors.Default
        'RCSN.DetectUrls = False
    End Try
End Sub

' 辅助方法:将HTML转换为RTF(适配标准RichTextBox)
Private Function ConvertHtmlToRtf(html As String) As String
    Using webBrowser As New WebBrowser()
        webBrowser.DocumentText = html
        ' 等待文档加载完成
        While webBrowser.ReadyState <> WebBrowserReadyState.Complete
            Application.DoEvents()
        End While
        webBrowser.Document.ExecCommand("SelectAll", False, Nothing)
        webBrowser.Document.ExecCommand("Copy", False, Nothing)
        Return Clipboard.GetText(TextDataFormat.Rtf)
    End Using
End Function

关键说明

  • 格式优先级:优先处理HTML格式,确保网页复制的文本格式(如字体、颜色、排版)被保留
  • 图片处理:单独提取剪贴板中的图片并插入到控件光标位置,保证图片正常粘贴
  • 兼容性适配:标准RichTextBox不直接支持HTML,通过WebBrowser控件将HTML转为RTF;若使用第三方富文本控件(如RichEditControl),可直接调用控件的HTML加载方法,无需转换
  • 降级逻辑:当无富文本格式时,自动切换到纯文本粘贴,保证基础功能可用

内容的提问来源于stack exchange,提问作者Magdy AlGamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:35:12