我正在尝试实现Windows自动播放处理程序;根据我发现的文档和示例,我应该查询IDataObject
"Autoplay Enumerated IDList Array"
剪贴板格式。
所以我试着这样做:
[DllImport("user32.dll", SetLastError = true, EntryPoint = "RegisterClipboardFormatW")]
public static extern uint RegisterClipboardFormat([MarshalAs(UnmanagedType.LPWStr)] String format);
private const string CFSTR_AUTOPLAY_SHELLIDLISTS = "Autoplay Enumerated IDList Array";
private static readonly uint AUTOPLAY_SHELLIDLISTS = RegisterClipboardFormat(CFSTR_AUTOPLAY_SHELLIDLISTS);
...
public int Drop(IDataObject pDataObj, int grfKeyState, Point pt, ref DropEffect pdwEffect)
{
var fmt = new FORMATETC
{
cfFormat = (short)AUTOPLAY_SHELLIDLISTS,
ptd = IntPtr.Zero,
dwAspect = DVASPECT.DVASPECT_CONTENT,
lindex = -1,
tymed = TYMED.TYMED_HGLOBAL
};
int hr = pDataObj.QueryGetData(ref fmt);
if (hr == S_OK)
{
...
}
return 0;
}
但QueryGetData
总是会返回S_FALSE
(和GetData
投掷,显然)。所以我尝试使用EnumFormatEtc
枚举可用的格式:它只返回一种格式它返回4种格式,其中没有一种格式与我传递给QueryGetData
的格式相同( cfFormat
值为-16238,15,-16378和-16377)。如果我使用EnumFormatEtc
中的第一种格式,而不是AUTOPLAY_SHELLIDLISTS
,那么一切正常,但我认为这不是正确的做法...
有人可以解释发生了什么吗?我使用的是错误的格式吗?
编辑:显然,EnumFormatEtc
返回的第一种格式为"Shell IDList Array"
;显然我可以使用它,但"Autoplay Enumerated IDList Array"
发生了什么?
答案 0 :(得分:1)
好的,我终于找到了一个很多更简单的方法,使用System.Windows.Forms.DataObject
类:
public int Drop(IDataObject pDataObj, int grfKeyState, Point pt, ref DropEffect pdwEffect)
{
try
{
var dataObj = new DataObject(pDataObj);
if (dataObj.ContainsFileDropList())
{
StringCollection files = dataObj.GetFileDropList();
// Do something with files...
}
return 0;
}
catch(Exception ex)
{
Trace.WriteLine(string.Format("Error: {0}", ex));
return 1;
}
}
不需要任何低级别的COM互操作(IDropTarget
接口声明除外)......