我在C#上做这个,但是,我想,这不是语言上的问题.
我有一些关于如何检测剪贴板内容变化的示例代码。现在,我想修改刚才复制的文本(去掉一些标签),并将剪贴板文本替换为固定文本。
但是,如果我在检测到剪贴板内容发生了更改时,SetDataObject()将生成剪贴板内容再次更改的消息。理论上,我猜,这听起来像是一个无限循环(在实践中,由于某种原因,它不是)。
这个修改的策略是什么?一次,然后将消息发送到剪贴板监控链中?
作为我正在做的测试,但是发生的是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);发布于 2009-10-12 16:25:20
不幸的是,无论何时使用Clipboard.SetDataObject设置剪贴板的数据,都会“重新绘制”剪贴板,因为您正在更改剪贴板的内容。
处理这种情况的最好方法是让您的例程检查剪贴板的内容,并且只有在实际更改剪贴板文本时才设置它。
在你的情况下,你说你要去掉一些标签。只需在例程之前和之后检查clipboardText字符串,如果字符串没有变化,就不要再次设置它。
这样,第一次,它会去掉标签,然后重置。然后再次触发,看到没有变化,也没有重置剪贴板数据。
发布于 2009-10-12 16:25:06
为了防止递归,只有当有要剥离的标记时,才应该实际设置剪贴板文本。
为了解释这种行为,我猜想WM_DRAWCLIPBOARD不是递归发送的,这意味着如果剪贴板在WM_DRAWCLIPBOARD通知期间被更改,它将不会再次发送。
发布于 2010-10-17 10:05:54
实际上,有一种更好的方法可以避免无限循环,即使在不修改剪贴板内容的情况下也是如此,因此,如果您更改或不修改它,则无法进行比较。
当您检测到WM_DRAWCLIPBOARD消息时,调用GetClipboardOwner,它将返回修改句柄的窗口的句柄。一旦你有了句柄,你就可以得到拥有这个窗口的进程。如果进程与您的流程不同,则处理剪贴板,否则剪贴板由您更改,因此忽略它。
https://stackoverflow.com/questions/1555492
复制相似问题