使用鼠标单击将 RichTextBox 的选定文本复制到剪贴板

Copy selected text of a RichTextBox to the Clipboard with a Mouse Click

我有一个 RichTextBox(RTB),它从两个来源获取文本,一个是 txt 文件,另一个是来自 SQLite 数据库的数据。
RTB 已将 ReadOnly 属性 设置为 False

我试图不使用 ContextMenuStrip。这可能是不可能的?
这是从数据库中获取数据并填充 RTB
的过程 突出显示我要复制的文本并在 RTB RESULT NO Copy

中单击

这次我单击我的代码运行的表单,但第二个进程尝试从数据库中获取相同的数据,但没有复制任何文本。
这是代码不整洁,但我正在测试。

Public Class frmViewCode
Dim gvW As String

Public Sub rtbViewCode_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
    If e.Button = System.Windows.Forms.MouseButtons.Left Then
        BigCopy()
        MsgBox("It Worked")
    End If
End Sub

好的,我更改了 BigCopy,现在所选代码已添加到剪贴板
但是我还是需要点击Form来执行代码
仍然想点击 RTB 以触发 BigCopy 代码?

    Public Sub BigCopy()
    Dim start = rtbViewCode.SelectionStart
    Dim substring = rtbViewCode.Text.Substring(0, start)
    Dim words = substring.Split(New String() {" ", vbCrLf}, StringSplitOptions.None)
    Dim count = words.Length
    gvW = rtbViewCode.SelectedText
    Clipboard.SetText(gvW)
End Sub

我很好奇如何更改 System.Windows.Forms 以便我可以点击 RTB。
问题如何 select RTB 中的文本并使用鼠标将该文本复制到剪贴板?

我也试过这个代码:

    Public Sub RightMouse_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim start = rtbViewCode.SelectionStart
    Dim substring = rtbViewCode.Text.Substring(0, start)
    Dim words = substring.Split(New String() {" ", vbCrLf}, StringSplitOptions.None)
    Dim count = words.Length
    MsgBox("Len " & count)
    lblMsg.Text = count.ToString()
    'gvW = words.ToString
    'gvW = rtbViewCode.SelectedText
    'Clipboard.SetText(gvW)

    Clipboard.SetText(rtbViewCode.SelectedRtf, TextDataFormat.Rtf)
    MsgBox("here " & gvW)
End Sub

我认为您最好使用 ContextMenuStrip。无论如何,您可以使用自定义控件捕获 WM_LBUTTONDOWN 并在按下鼠标左键时执行复制,有一个活动选择并且鼠标指针位于选择内。
在这种情况下,您抑制 消息,因此不会删除选择。

如果要在将焦点移动到其他控件时保持选择可见,请设置 HideSelection = False

如果这不是预期的行为,请更改 IsMouseDownInsideSelection() 方法或 WM_LBUTTONDOWN 中的 逻辑

Public Class RichTextBoxEx
    Inherits RichTextBox

    Private Const WM_LBUTTONDOWN As Integer = &H201

    Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = WM_LBUTTONDOWN Then
            If SelectionLength > 0 AndAlso IsMouseDownInsideSelection() Then
                Copy()
                Return
            End If
        End If
        MyBase.WndProc(m)
    End Sub

    Private Function IsMouseDownInsideSelection() As Boolean
        Dim charIdx = GetCharIndexFromPosition(PointToClient(MousePosition))
        If charIdx >= SelectionStart AndAlso charIdx <= (SelectionStart + SelectionLength) Then Return True
        Return False
    End Function
End Class

您可以使用 Clipboard.SetText(RichTextBox1.Text) 功能将所有文本复制到剪贴板