对于我正在编写的一个小型实用程序(.NET、C#),我想监视剪贴板复制操作和剪贴板粘贴操作。
我的想法是在粘贴到任意应用程序时提供我自己的数据。
使用剪贴板查看器可以轻松地监视复制操作。
对我来说似乎更先进的事情是编写一个“剪贴板粘贴提供程序”:
- 回答应用程序的“可用的格式”查询。
- 向应用程序粘贴操作提供数据。
我猜我必须以某种方式模仿/劫持当前的剪贴板。
问题:
是否可以根据粘贴操作“包装”剪贴板并提供我自己的“剪贴板代理”?
查看 WinAPI 中的“延迟渲染”。使用这种技术,您可以使用空句柄加载剪贴板,并且在粘贴时,Windows 会通过 WM_RENDERFORMAT 消息通知您。这就是 Excel 之类的应用程序可以摆脱“复制”25 种不同格式的方式。它并没有真正复制它们。它实际上会生成一些常见的文本,如 TEXT,但会“宣传”其他的,如 Bitmap、Html、WKS 等,选择等待查看目标应用程序想要粘贴的内容。
考虑一下:您可以在 Excel 中选择 5000 个单元格并进行复制,剪贴板会很快更新。现在粘贴到 Windows Paint 中,当 Excel 尝试渲染一个巨大的位图时,您的系统突然爬行。在使用所有可用内存并吃掉页面文件后,旧版本通常会崩溃。不过,这又回到了 Windows 3.1 时代。现代版本会给出有关“位图太大”或“内存不足”的消息。警告:延迟渲染将由监视剪贴板并将数据自动粘贴到自身的应用程序过早触发,例如远程桌面、VMWare、Office 剪贴板和我自己的 ClipMate。可以使用 CF_Clipboard_Viewer_Ignore 标志告诉一些剪贴板监视程序忽略剪贴板更新,我在此处记录了该标志:
link text
您需要使用 windows 挂钩来挂钩剪贴板挂钩。Windows 钩子是一种拦截全局事件发生并提供您自己的钩子过程来替换或拦截消息的方法。在CodeProject上查看这里,它解释了如何挂钩。这是一个监听复制/粘贴功能的剪贴板助手。这是一个剪贴板间谍,它就是这样做的。这是另一篇实现剪贴板钩子的文章。