2

Windows Autoplay ハンドラーを実装しようとしています。ドキュメントと私が見つけた例によると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つのフォーマットを返す1つのフォーマットのみを返します.どれも私が渡したものと同じではありませんQueryGetData(cfFormat値は-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 に答える