2012/10/29(Mon) 13:02:15 編集(投稿者)
確認しました。確かにD&Dの場合、その辺が全部空になるようです。
System.Runtime.InteropServices.ComTypes.IDataObjectを使ってCOMオブジェクトに直接アクセスすれば、いずれも問題なく取れるようです。
Metafileの場合はこんな感じ。PNGなどの場合はSystem.Runtime.InteropServices.ComTypes.IStreamを使うことになるのでちょっとだけ面倒ですが。
static Metafile GetMetafile(System.Windows.Forms.IDataObject obj)
{
var iobj = (System.Runtime.InteropServices.ComTypes.IDataObject)obj;
var etc = iobj.EnumFormatEtc(System.Runtime.InteropServices.ComTypes.DATADIR.DATADIR_GET);
var pceltFetched = new int[1];
var fmtetc = new System.Runtime.InteropServices.ComTypes.FORMATETC[1];
while (0 == etc.Next(1, fmtetc, pceltFetched) && pceltFetched[0] == 1)
{
var et = fmtetc[0];
var fmt = DataFormats.GetFormat(et.cfFormat);
if (fmt.Name != "EnhancedMetafile")
{
continue;
}
System.Runtime.InteropServices.ComTypes.STGMEDIUM medium;
iobj.GetData(ref et, out medium);
return new Metafile(medium.unionmember, true);
}
return null;
}