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"
ですか?