修改剪贴板更改中的剪贴板内容

时间:2009-10-12 16:17:36

标签: c# clipboard

我在C#中这样做,但是,我想,这不是语言特定的问题......

我有一些关于如何检测剪贴板内容发生变化的示例代码。现在我想修改刚刚复制的文本(剥离一些标签)并用固定的文本替换剪贴板文本。

但是当我检测到剪贴板内容发生变化时,如果我是SetDataObject(),则会生成剪贴板内容再次更改的消息。理论上,我猜,它听起来像一个无限循环(实际上由于某种原因,它不是)。

修改一次的策略是什么,并将消息发送到剪贴板监控链?


P.S。作为一个测试我正在做跟随,但会发生什么是Clipboard.SetDataObject ..线被调用两次。我不明白为什么,我希望它无限地做到这一点。

case Win32.Msgs.WM_DRAWCLIPBOARD:

    String clipboardText = GetClipboardText();
    if (!String.IsNullOrEmpty(clipboardText))
    {
        Clipboard.SetDataObject("test( " + clipboardText + " )!");
    }

    Win32.User32.SendMessage(_ClipboardViewerNext, m.Msg, m.WParam, m.LParam);

3 个答案:

答案 0 :(得分:1)

为了防止递归,如果有要剥离的标记,则应该只设置剪贴板文本。

为了解释这种行为,我猜测WM_DRAWCLIPBOARD不是递归发送的,这意味着如果在WM_DRAWCLIPBOARD通知期间更改了剪贴板,则不会再次发送它。

答案 1 :(得分:1)

不幸的是,每当你使用Clipboard.SetDataObject设置剪贴板的数据时,你都会“重绘”剪贴板,因为你正在改变它的内容。

处理这种情况的最佳方法是让您的例程检查剪贴板内容,并且只有在您实际更改剪贴板文本时才设置它。

在你的情况下,你说你正在剥离一些标签。只需在例程之前和之后检查clipboardText字符串,如果字符串未更改,请不要再设置它。

这样,第一次,它会剥离标签,然后重置。然后再次触发,看看没有变化,也没有重置剪贴板数据。

答案 2 :(得分:1)

实际上有一种更好的方法可以避免无限循环,即使在你没有修改剪贴板内容的情况下也是如此,因此如果你改变它就无法比较。

当您检测到WM_DRAWCLIPBOARD消息调用GetClipboardOwner 时,它将返回修改句柄的窗口的句柄。获得句柄后,您就可以获得拥有该窗口的进程。如果该过程与您的过程不同,则处理剪贴板,否则您更改了剪贴板,请忽略它。