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

9
我正在编写一个小型实用程序(.NET,C#),我想监视剪贴板复制操作和剪贴板粘贴操作。
我的想法是在粘贴到任意应用程序时提供自己的数据。
使用剪贴板查看器可以轻松监视复制操作。
对我来说似乎更高级的是编写“剪贴板粘贴提供程序”:
- 回答应用程序的“哪些格式可用”的查询。 - 为应用程序粘贴操作提供数据。
我找到了this postingthis posting,但它们似乎都没有真正帮助我。
我猜我必须以某种方式模仿/劫持当前的剪贴板。
问题:
是否可能在粘贴操作方面“包装”剪贴板并提供自己的“剪贴板代理”?

1
PS:我知道你在CodeProject上;)讽刺的是我把你重定向到Codeproject来了! :D 哈哈 - t0mm13b
2个回答

12
请查阅WinAPI中的“延迟渲染”技术。通过此技术,您可以使用空句柄加载剪贴板,并在粘贴时接收到 WM_RENDERFORMAT 消息通知。这就是 Excel 等应用程序如何处理“复制”25种不同格式的内容。它实际上并没有复制所有格式,而只制作一些常用的格式,如 TEXT,但“广告”其他格式,如位图、HTML、WKS 等,选择等待目标应用程序要粘贴的内容。
考虑这个例子:您可以在 Excel 中选择 5000 个单元格并复制,然后剪贴板会很快更新。现在将其粘贴到 Windows Paint 中,系统会突然变得非常缓慢,因为 Excel 尝试呈现一个巨大的位图。旧版本通常会崩溃,在使用所有可用内存并占用页面文件后。尽管如此,现代版本会显示“位图太大”或“内存不足”的消息。 警告:监视剪贴板并自动将数据粘贴到自己的应用程序(如远程桌面、VMWare、Office 剪贴板和我的 ClipMate)可能会提前触发延迟渲染。有些剪贴板监视程序可以使用 CF_Clipboard_Viewer_Ignore 标志告诉它们忽略剪贴板更新,我在这里记录了这些信息:链接文本

11
您需要使用Windows钩子来挂钩剪贴板钩子。Windows钩子是截取全局事件并提供自己的钩子过程替换或拦截消息的一种方式。在这里查看CodeProject,了解如何进行钩子:EasyHook64。这里有一个监听复制/粘贴功能的剪贴板助手。这里有一个仅实现此功能的剪贴板监听器。还有另一篇文章实现了剪贴板钩子

5
谢谢,汤姆!最好的文章参考是钩住“Ctrl+V”的那篇。但是:如果用户右键并从上下文菜单中选择“粘贴”,或以其他完全不同的方式进行操作呢?我想解决方案应该是不要挂钩于键盘/鼠标/任何东西,而是拦截直接的剪贴板通信本身。 - Uwe Keim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接