我正在尝试实现 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"
什么?