如何获取剪贴板粘贴通知并提供我自己的数据?

对于我正在编写的小实用程序(.NET,C#),我想监视剪贴板复制操作和剪贴板粘贴操作。

我的想法是在粘贴到任意应用程序时提供我自己的数据。

使用剪贴板查看器可以轻松完成对复制操作的监视。

对我来说似乎更先进的东西是写一个“剪贴板粘贴提供者”:

  • 回答“应用程序的可用格式”查询。
  • 为应用程序粘贴操作提供数据。

我发现这个post和这个post ,但它们似乎都没有真正帮助我。

我猜我不得不模仿/劫持当前的剪贴板。

题:

是否可以在粘贴操作方面“包装”剪贴板并提供我自己的“剪贴板代理”?

您需要使用Windows钩子挂钩剪贴板挂钩。 Windows钩子是一种拦截发生的全局事件并提供您自己的钩子过程来替换或拦截消息的方法。 看看CodeProject ,它解释了如何挂钩。 这是一个剪贴板助手 ,可以监听复制/粘贴function。 这是一个剪贴板间谍就是这样做的。 这是另一篇实现Clipboard钩子的文章。

查看WinAPI中的“延迟呈现”。 使用此技术,您可以使用空句柄加载剪贴板,并在粘贴时,Windows会通过WM_RENDERFORMAT消息通知您。 这就是像Excel这样的应用程序可以通过“复制”25种不同的格式来逃脱。 它并没有真正复制它们。 它实际上会产生一些常见的,如TEXT,但“广告”其他像Bitmap,Html,WKS等,选择等待看看目标应用程序想要粘贴的内容。
考虑一下:您可以在Excel中选择5000个单元格并进行复制,并且可以非常快速地更新剪贴板。 现在粘贴到Windows画图中,当Excel尝试渲染一个巨大的位图时,您的系统突然爬行。 在使用所有可用内存并吃掉页面文件后,旧版本通常会崩溃。 这回到了Windows 3.1天。 现代版本给出了关于“位图太大”或“内存不足”的消息。 警告:监视剪贴板并自动粘贴数据的应用程序会过早触发延迟渲染,例如远程桌面,VMWare,Office剪贴板和我自己的ClipMate。 可以通过使用CF_Clipboard_Viewer_Ignore标志告诉某些剪贴板监视程序忽略剪贴板更新,我在此处记录了这一点: 链接文本