当用户选择副本时,自动将文本粘贴到RichTextBox

时间:2014-10-12 09:27:45

标签: c# richtextbox copy-paste

我正在开发一个包含RichTextBox的C#应用​​程序。每次用户从其他应用程序(如Web浏览器)复制文本时,我都希望自动将复制的文本粘贴到RichTextBox。我可以通过以下代码粘贴复制的文本:

if (Clipboard.ContainsText())
     rtb1.Paste();

问题是我不知道用户何时从弹出菜单中点击副本或在其他应用程序中按Ctrl + C。 有没有办法检查没有Timer来检查剪贴板内容,如每一秒?

1 个答案:

答案 0 :(得分:0)

我找到了答案here

为了做到这一点,我们需要对AddClipboardFormatListenerRemoveClipboardFormatListener进行异议。

/// <summary>
/// Places the given window in the system-maintained clipboard format listener list.
/// </summary>
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AddClipboardFormatListener(IntPtr hwnd);

/// <summary>
/// Removes the given window from the system-maintained clipboard format listener list.
/// </summary>
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RemoveClipboardFormatListener(IntPtr hwnd);

/// <summary>
/// Sent when the contents of the clipboard have changed.
/// </summary>
private const int WM_CLIPBOARDUPDATE = 0x031D;

然后我们需要通过使用窗口的句柄作为参数调用AddClipboardFormatListener方法将我们的窗口添加到剪贴板格式侦听器列表。将以下代码放在主窗口窗体构造函数或其任何加载事件中。

AddClipboardFormatListener(this.Handle);    // Add our window to the clipboard's format listener list.

覆盖WndProc方法,以便我们可以在发送 WM_CLIPBOARDUPDATE 时捕获。

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if (m.Msg == WM_CLIPBOARDUPDATE)
    {
        IDataObject iData = Clipboard.GetDataObject();      // Clipboard's data.

        if (iData.GetDataPresent(DataFormats.Text))
        {
            rtb1.Paste();
        }
     }
}

最后确保在关闭表单之前从剪贴板格式侦听器列表中删除主窗口。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    RemoveClipboardFormatListener(this.Handle);     // Remove our window from the clipboard's format listener list.
}