深度理解:外壳剪贴板格式及通知机制

时间:2019-07-27 来源:www.mxplayerdownloadi.com

电子游艺厅适用法律

标准剪贴板格式

在Windows中,标准剪贴板格式使用前缀为CF的统一格式定义,例如:

CF_TEXT:用于传输ANSI文本

CF_UNICODETEXT:用于传输一段UNICODE文本

CF_HDROP:用于传输一组文件

大多数shell剪贴板格式没有预定义值

值得注意的是,某些格式具有预定义值,而其他格式则没有。除了具有预定义值的CF_HDROP之外,还需要使用要使用的RegisterClipboardFormat来注册其他shell剪贴板格式。 Windows定义以CFSTR开头的字符串,可以将其传递给RegisterClipboardFormat进行注册,并在注册后返回格式值。

例如,如果我们想要获得Drag& Drop操作类型,我们可以注册CFSTR_PREFERREDDROPEFFECT格式。

UINT uDropEffect=RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);

生成的uDropEffect值可以在FORMATETC结构的cfFormat成员中使用。

Shell剪贴板格式三大类

1)用于传输文件对象

CF_HDROP(预定义值)

CFSTR_FILECONTENTS(需要注册)

CFSTR_FILEDESCRIPTOR(需要注册)

CFSTR_FILENAME(需要注册)

CFSTR_FILENAMEMAP(需要注册)

CFSTR_MOUNTEDVOLUME(需要注册)

CFSTR_SHELLIDLIST(需要注册)

CFSTR_SHELLIDLISTOFFSET(需要注册)

2)用于传输虚拟对象

CFSTR_NETRESOURCES

CFSTR_PRINTERGROUP

CFSTR_INETURL

CFSTR_SHELLURL(已弃用)

3)用于发送通知

CFSTR_INDRAGLOOP

CFSTR_LOGICALPERFORMEDDROPEFFECT

CFSTR_PASTESUCCEEDED

CFSTR_PERFORMEDDROPEFFECT

CFSTR_PREFERREDDROPEFFECT

CFSTR_TARGETCLSID

CFSTR_UNTRUSTEDDRAGDROP

DragWindow

关于CF_HDROP

此格式主要用于传输一组文件,通常用于shell的复制/粘贴和Drag& Drop操作。由于此值是预定义的,因此我们不需要调用RegisterClipboardFormat来注册它。

与此格式一起使用的是由STGMEDIUM的hGlobal成员指向的全局数据区域。该数据区域的数据实际上是DROPFILES结构。我们可以使用DragQueryFile函数来获取此区域中保存的文件列表。

示例代码如下:

ff416359d7564693b8c6668556611d06

当我们想将数据以CF_HDROP格式放入剪贴板时,我们需要严格按照DROPFILES的格式填写它。

具体来说:将每个文件的路径放入内存区域,用 0分隔。在内存区域的末尾,您需要添加一个额外的 0。

例如,我们需要传输以下两个文件路径,然后我们填写的数据格式如下

要传输的文件:c: 111.txt和d: 222.txt

填充格式:c: 111.txt 0d: 222.txt 0 0

来源与目的地之间的沟通

这里的传输源和目标可以理解如下:

当我们将文件从应用程序拖到资源管理器中时,传输源是应用程序,传输目标是资源管理器。

当我们将文件从资源管理器拖到应用程序时,传输源是资源管理器,传输目标是应用程序。

当我们从应用程序复制文件并将其粘贴到资源管理器中时,传输源是应用程序,传输目标是资源管理器。

当我们从资源管理器复制文件并将其粘贴到应用程序中时,传输源是资源管理器,传输目标是应用程序。

例如,如果传输源想要知道传输目标成功接收到文件,则需要一些机制来向传输源发送通知。

CFSTR_INDRAGLOOP:

数据对象使用它来确定它当前是否处于Drag& Drop循环(是否被拖动)。

CFSTR_LOGICALPERFORMEDDROPEFFECT:

传输源可以通过这种格式判断数据传输的结果。与之结合使用的数据是一个DWORD值,可以通过检查DWORD值类来获得。与CFSTR_PERFORMEDDROPEFFECT类似,此值最初是为了通知传输源shell实际执行的操作。但是,shell将使用优化的移动来执行文件传输,因此使用CFSTR_PERFORMEDDROPEFFECT来确定执行的操作类型是不可靠的。

因此,当您想知道shell的作用时,请使用CFSTR_LOGICALPERFORMEDDROPEFFECT格式并检查其对应的值是否为DROPEFFECT_MOVE或DROPEFFECT_COPY。

CFSTR_PASTESUCCEEDED:

该格式用于传输目标通知传输源,并且已成功执行粘贴时删除操作。与之结合使用的数据也是DROPEFFECT类型的DWORD值。传输源可以根据该通知执行相应的动作。

CFSTR_PERFORMEDDROPEFFECT

这主要用于Drag& Drop,并且传输目的地可以使用该通知来通知传输源做什么。我们使用DoDragDrop启动Drag& Drop过程,其返回值pdwEffect有时无法可靠地告诉我们传输目标执行的操作类型。因此,使用CFSTR_PERFORMEDDROPEFFECT是确定shell是否执行优化移动的好方法。

CFSTR_PREFERREDDROPEFFECT

由传输源使用以指示所需的操作类型。传输目的地可能未被执行,因此传输目的地发送CFSTR_PERFORMEDDROPEFFECT以告知传输源它实际执行的操作类型。

e1797716829747fe8c190cbf8780fdd6