2

我正在尝试实现 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 种格式,其中没有一种与我传递给的格式相同QueryGetDatacfFormat值为 -16238、15、-16378 和 -16377)。如果我使用第一种格式EnumFormatEtc,而不是AUTOPLAY_SHELLIDLISTS,一切正常,但我认为这不是正确的方法......

有人可以解释发生了什么吗?我使用了错误的格式吗?

编辑:显然从返回的第一个格式EnumFormatEtc"Shell IDList Array"; 显然我可以使用它,但是发生了"Autoplay Enumerated IDList Array"什么?

4

1 回答 1

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接口声明除外)...

于 2013-04-12T15:03:14.283 回答