首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改剪贴板内容更改剪贴板

修改剪贴板内容更改剪贴板
EN

Stack Overflow用户
提问于 2009-10-12 16:17:36
回答 3查看 3K关注 0票数 2

我在C#上做这个,但是,我想,这不是语言上的问题.

我有一些关于如何检测剪贴板内容变化的示例代码。现在,我想修改刚才复制的文本(去掉一些标签),并将剪贴板文本替换为固定文本。

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

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

作为我正在做的测试,但是发生的是Clipboard.SetDataObject..。电话线被打了两次。我不明白为什么,我希望它能无限地做到这一点。

代码语言:javascript
复制
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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-12 16:25:20

不幸的是,无论何时使用Clipboard.SetDataObject设置剪贴板的数据,都会“重新绘制”剪贴板,因为您正在更改剪贴板的内容。

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

在你的情况下,你说你要去掉一些标签。只需在例程之前和之后检查clipboardText字符串,如果字符串没有变化,就不要再次设置它。

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

票数 1
EN

Stack Overflow用户

发布于 2009-10-12 16:25:06

为了防止递归,只有当有要剥离的标记时,才应该实际设置剪贴板文本。

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

票数 1
EN

Stack Overflow用户

发布于 2010-10-17 10:05:54

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

当您检测到WM_DRAWCLIPBOARD消息时,调用GetClipboardOwner,它将返回修改句柄的窗口的句柄。一旦你有了句柄,你就可以得到拥有这个窗口的进程。如果进程与您的流程不同,则处理剪贴板,否则剪贴板由您更改,因此忽略它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1555492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档