geelaw
304 天前
如果是读取剪贴板数据的软件实现,当然没有问题,第一次按 Ctrl+V 之后,软件读到 1,2,3,4,5,6,7,8,9 ,然后记住目前在输出列表,如此这般,这般那般,皆大欢喜。
如果是放置剪贴板数据的软件这样做,则 Windows 上不存在可靠的方法实现这个需求。
Windows 的剪贴板数据流是这样的:
1. 程序 A 打开剪贴板并清空之,此时剪贴板的所有者是 A 。如果剪贴板曾经有所有者 C ,则 C 被告知它已经不是所有者。
2. A 在剪贴板上放置各种数据,并标记一些格式延迟渲染。
3. A 关闭剪贴板。
4. 程序 B 打开剪贴板并查询支持的格式。
5. B 选择一些格式获取数据。
6. 如果获取的数据是非延迟渲染,则 A 被告知需要渲染某格式,此时 A 把数据放入剪贴板。
7. B 关闭剪贴板。
这一段表明,若剪贴板上某个格式(例如字符串)已经有数据(非延迟渲染,或延迟渲染且已经渲染过),则再次读取那一格式的时候 A 不会知道,也就是某个格式的数据一旦放入剪贴板,A 就不会在有机会考虑修改它了。
一种思路是这样的:A 设置字符串是延迟渲染,并且在第一次被要求渲染的时候放入 1 ,然后在 B 读完之后重设为延迟渲染(下次放入 2 ),或者放入 2 。
这样做不可靠有理论原因和实际原因,理论原因是 A 不可能知道 B 什么时候读取完毕,实际原因是 B 读取一次不代表用户粘贴一次,比如各种 Office 程序,当鼠标悬停在“粘贴”上的时候就会读取一次剪贴板显示预览,但用户不一定要真的粘贴,A 自然无从判断 B 读取之后是否应该“前进”。