我可以找到的所有格式都是MS文档中的格式。当尝试实现文件拖放(从我的应用程序到Windows的文件浏览器)时,我收到许多GetData要求提供cfFormat值的请求,例如-16230,-15835,-15834,但我不知道它们是什么。
[当我尝试使用该DoDragDrop功能将文件名从应用程序拖到文件资源管理器时,显示完整日志。]
Mouse Down
EnumFormatEtc
EnumFormatEtc::Next(1)
EnumFormatEtc::Next(1)
EnumFormatEtc::Reset
EnumFormatEtc::Next(1)
EnumFormatEtc::Next(1)
QueryGetData(cf = 15, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16230, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15835, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15834, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15833, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16215, ty = TYMED_ISTREAM, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15797, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
QueryGetData(cf = -16230, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
SetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15797, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
SetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15797, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
SetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15797, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
SetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15797, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
SetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15797, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
SetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15797, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
SetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15797, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
SetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
GetData(cf = -16206, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -15832, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
GetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Returning null.
SetData(cf = -16207, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
SetData(cf = -15864, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
SetData(cf = -15835, ty = TYMED_HGLOBAL, asp = DVASPECT_CONTENT)
Run Code Online (Sandbox Code Playgroud)
[相关代码]
public void GetData(ref FORMATETC format, out STGMEDIUM medium)
{
Debug.WriteLine($"GetData(cf = {format.cfFormat}, ty = {format.tymed}, asp = {format.dwAspect})");
if (format.cfFormat == CF_HDROP &&
(format.tymed & TYMED.TYMED_HGLOBAL) == TYMED.TYMED_HGLOBAL)
{
Debug.WriteLine("Returning file drop data");
var mem = CreateDropFiles(new[] { file1, file2
});
medium = new STGMEDIUM();
medium.tymed = TYMED.TYMED_HGLOBAL;
medium.unionmember = mem;
medium.pUnkForRelease = IntPtr.Zero;
}
else
{
Debug.WriteLine("Returning null.");
medium = new STGMEDIUM();
medium.tymed = TYMED.TYMED_NULL;
medium.unionmember = IntPtr.Zero;
medium.pUnkForRelease = IntPtr.Zero;
}
}
public int QueryGetData(ref FORMATETC format)
{
Debug.WriteLine($"QueryGetData(cf = {format.cfFormat}, ty = {format.tymed}, asp = {format.dwAspect})");
if (format.cfFormat == CF_HDROP)
return S_OK;
else
return DV_E_FORMATETC;
}
public void SetData(ref FORMATETC formatIn, ref STGMEDIUM medium, bool release)
{
Debug.WriteLine($"SetData(cf = {formatIn.cfFormat}, ty = {formatIn.tymed}, asp = {formatIn.dwAspect})");
}
Run Code Online (Sandbox Code Playgroud)
我使用了FORMATETCin System.Runtime.InteropServices.ComTypes,它具有public short cfFormat,但是在Windows的API中,它定义为CLIPFORMAT cfFormat,后者typedef WORD CLIPFORMAT依次为typedef unsigned short WORD;。因此,对我而言,类型不匹配(短和无符号短)。我不确定这是否重要。
首先,您可以正确声明类型不匹配。剪贴板格式是无符号的。让我们取一个值:
-16230
被视为带符号WORD,这是
0xC09A
这并不奇怪。RegisterClipboardFormat的文档说:
注册的剪贴板格式由0xC000到0xFFFF范围内的值标识。
剪贴板格式的文档中提到了其他可能的值:
应用程序可以通过在CF_PRIVATEFIRST到CF_PRIVATELAST范围内定义一个值来标识私有剪贴板格式
CF_PRIVATEFIRST通过CF_PRIVATELAST映射0x0200到0x02FF。
显然,您会看到一种注册的剪贴板格式。要查看其真正的类型,您需要GetClipboardFormatName在遇到该值时调用。它可能会不时更改,因为这些值是在不同组件注册其剪贴板格式时发出的。