Windows VC++编程问题,如何获取文件粘贴事件,在粘贴事件执行前做一些操作。

jkkj1630 2018-06-27 10:51:22
Windows VC++编程问题,如何获取文件粘贴事件,在粘贴事件执行前做一些操作。
我在做一个远控软件,但我想让我的远控软件支持远程复制粘贴,在本地复制后,粘贴到远程桌面,但复制后不想立即传输到远程端电脑,我是希望能本地复制后,更新远端电脑的剪贴板信息,等远端执行粘贴命令时,传输到远程端,然后进行粘贴,不太清楚OLE剪贴板是否能解决我的问题,对OLE剪贴板我还不是很了解。

本人最开始有以下两个计划,但总觉得Hook技术偶尔不是很稳定,希望能有不需要Hook的方法:
1.本地复制,发送到远程端文件列表信息更新剪贴板,然后判断到复制的是文件时,远程端Hook粘贴函数,等粘贴函数执行的时候,发送到控制端粘贴命令,然后发给远程端粘贴。
2.本地复制,发送到远端文件列表信息更新剪贴板,远程端临时创建几个与被复制同名的文件,将剪贴板的信息设置为这几个临时文件,然后Hook住这几个文件的读写函数,等读取这几个文件的时候,通知控制端进行传输,传输完成后继续这几个文件的读取。
本人看过VNC的源码,里面貌似没有文件远程复制粘贴功能,只有文件远程传输功能,但我想直接加入复制粘贴功能,跪求各位大神有没有什么好的方法,尽量不使用Hook进行文件传输,本人监控过TeamViewer的文件复制粘贴,但TV好像是注册了一种剪贴板数据类型,使用OLE剪贴板进行文件粘贴,但具体怎么实现的我不清楚。
...全文
355 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xb_0916 2019-11-21
  • 打赏
  • 举报
回复
引用 10 楼 <span style="color:#4788C7">mrzhjy</span>的回复:
1、在本地复制时,通知远端,本地制制的文件信息:文件全名(含路径),并将此信息自定义格式存入系统剪贴板中;
2、如果在远端执行粘贴时,将自定义剪贴板中内容取出,发起远程文件传输请求;
3、实现文件传输(需要实现完整的文件传输协议,可以多线程,分块传输,文件断点续传等),传输过程可以显示远程传输速度,已完成的进度,跟本地复制大文件的显示类似;
4、将传输校验后的文件内容写到当地文件系统的目标文件夹内;

如果是局域网,可将本地文件名转为网络文件路径,通过系统的复制功能实现,只是需要修改剪贴板内容即可简单实现,如果是远程网络,无法远程定位文件,OS无法直接访问远程文件标识,则需要自己实现文件传输功能;
<br />你好,我想知道在远端执行粘贴事件,是哪个事件?怎样截获系统粘贴事件?
jkkj1630 2018-06-30
  • 打赏
  • 举报
回复
引用 15 楼 jiangsheng 的回复:
可能是你的剪贴板格式选择有问题。对于延迟提供的虚拟文件,参考
Why is my delay-rendered format being rendered too soon?
https://blogs.msdn.microsoft.com/oldnewthing/20070918-00/?p=25083


真是大神,我试了,设置剪贴板数据时,数据格式这样设置就没问题了:
SetClipboardData(RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR),NULL);

大神能抱个大腿私信留个QQ嘛。。。
蒋晟 2018-06-30
  • 打赏
  • 举报
回复
可能是你的剪贴板格式选择有问题。对于延迟提供的虚拟文件,参考
Why is my delay-rendered format being rendered too soon?
https://blogs.msdn.microsoft.com/oldnewthing/20070918-00/?p=25083
mrzhjy 2018-06-29
  • 打赏
  • 举报
回复
如果是复制文件或文件夹,剪贴板中只是该文件或文件夹的基本信息,而跟其内容一点关系统都没有,只有在点粘贴的时候,才真正去取其内容并处理,即你在复制后,对文件或文件夹内容修改后,粘贴的仍是最后的信息,比如复制前,你的文件夹的空的,但在粘贴前,你往里放了一些东西,则最后复制的是你放进去的内容
赵4老师 2018-06-29
  • 打赏
  • 举报
回复
这次我胡扯的帖子咋没被删掉呢?
mrzhjy 2018-06-29
  • 打赏
  • 举报
回复
瞎说八道什么呀,什么叫延迟提供数据功能?剪贴板就是剪贴板,先深入了解了剪贴板再说吧
mrzhjy 2018-06-29
  • 打赏
  • 举报
回复
1、在本地复制时,通知远端,本地制制的文件信息:文件全名(含路径),并将此信息自定义格式存入系统剪贴板中;
2、如果在远端执行粘贴时,将自定义剪贴板中内容取出,发起远程文件传输请求;
3、实现文件传输(需要实现完整的文件传输协议,可以多线程,分块传输,文件断点续传等),传输过程可以显示远程传输速度,已完成的进度,跟本地复制大文件的显示类似;
4、将传输校验后的文件内容写到当地文件系统的目标文件夹内;

如果是局域网,可将本地文件名转为网络文件路径,通过系统的复制功能实现,只是需要修改剪贴板内容即可简单实现,如果是远程网络,无法远程定位文件,OS无法直接访问远程文件标识,则需要自己实现文件传输功能;
jkkj1630 2018-06-29
  • 打赏
  • 举报
回复
可能在目录下右键弹出菜单需要判断下数据类型,如果数据类型为文字之类的时候,那个粘贴菜单项是灰色的,但右键就发过来WM_RENDERFORMAT消息,我程序就不知道到底是右键弹出过来的消息,还是粘贴过来的消息了。。。。。。。
jkkj1630 2018-06-29
  • 打赏
  • 举报
回复
引用 7 楼 jiangsheng 的回复:
Windows支持剪贴板延迟提供数据的(不可能你复制个几G的文件Windows就把几G的文件都读到内存里),服务器和客户端用WM_RENDERFORMAT和WM_RENDERALLFORMATS来在有程序请求剪贴板的时候再复制剪贴板内容就行了。

楼上也是胡扯,用户在自己的软件里处理用户的复制粘贴操作也叫恶意拦截剪贴板……那世界上有不恶意拦截剪贴板的程序?


感谢大神回答,经过一晚上测试,发现这个延迟提交数据有个缺点,就是设置剪贴板数据为NULL时,还不等粘贴呢,就在任何一个目录下右键弹出菜单的时候,WM_RENDERFORMAT消息就发过来了,也许并不是粘贴,可能只是右键刷新一下,这时候WM_RENDERFORMAT消息并不会说明此次是右键菜单弹出获取剪贴板数据还是真正的粘贴获取数据,求教大神,是这样的吗。
jkkj1630 2018-06-29
  • 打赏
  • 举报
回复

[/quote]

引用 13 楼 mrzhjy 的回复:
如果是复制文件或文件夹,剪贴板中只是该文件或文件夹的基本信息,而跟其内容一点关系统都没有,只有在点粘贴的时候,才真正去取其内容并处理,即你在复制后,对文件或文件夹内容修改后,粘贴的仍是最后的信息,比如复制前,你的文件夹的空的,但在粘贴前,你往里放了一些东西,则最后复制的是你放进去的内容


您说的这些我清楚,但我不清楚的是,如何获取粘贴动作执行的事件,如何知道对方什么时候开始粘贴的呢?
zgl7903 2018-06-28
  • 打赏
  • 举报
回复
赵4老师 2018-06-28
  • 打赏
  • 举报
回复
个人建议还是洗洗睡吧。
蒋晟 2018-06-28
  • 打赏
  • 举报
回复
Windows支持剪贴板延迟提供数据的(不可能你复制个几G的文件Windows就把几G的文件都读到内存里),服务器和客户端用WM_RENDERFORMAT和WM_RENDERALLFORMATS来在有程序请求剪贴板的时候再复制剪贴板内容就行了。

楼上也是胡扯,用户在自己的软件里处理用户的复制粘贴操作也叫恶意拦截剪贴板……那世界上有不恶意拦截剪贴板的程序?
赵4老师 2018-06-28
  • 打赏
  • 举报
回复
结合百度云盘API实现?
jkkj1630 2018-06-28
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
恶意拦截剪贴板操作,是破坏系统安全的节奏。

什么叫恶意呢?
jkkj1630 2018-06-28
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
参考下 SetClipboardViewer

这个貌似是监控复制事件的,而不是监控粘贴事件的。
赵4老师 2018-06-28
  • 打赏
  • 举报
回复
恶意拦截剪贴板操作,是破坏系统安全的节奏。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧