public List <PIDL> GetCida() { var f = FormatId.CFSTR_SHELLIDLIST.FormatEtc; STGMEDIUM s = default; try { DataObject.GetData(ref f, out s); return(s.InvokeHGlobal <uint, List <PIDL> >(x => { var l = new List <PIDL>(); unsafe { fixed(void *ptr = x) { for (var i = 0; i < x[0] + 1; i++) { l.Add(new PIDL((IntPtr)((byte *)ptr + x[i + 1]), true)); } } } return l; })); } finally { s.Dispose(); } }
public string[] GetFileDropList() { var f = FormatId.CF_HDROP.FormatEtc; STGMEDIUM s = default; try { DataObject.GetData(ref f, out s); return(s.GetFiles()); } finally { s.Dispose(); } }
public string GetString(FormatId id, NativeStringType type) { var f = DataObjectUtils.GetFormatEtc(id); STGMEDIUM s = default; try { DataObject.GetData(ref f, out s); return(s.GetString(type)); } finally { s.Dispose(); } }
public TResult ReadHGlobal <TResult>(FormatId id) where TResult : unmanaged { STGMEDIUM s = default; var f = id.FormatEtc; try { DataObject.GetData(ref f, out s); return(s.ReadHGlobal <TResult>()); } finally { s.Dispose(); } }
public Image GetBitmap() { var f = FormatId.CF_BITMAP.FormatEtc; STGMEDIUM s = default; try { DataObject.GetData(ref f, out s); if (s.tymed != TYMED.TYMED_GDI) { throw new ApplicationException("Invalid Tymed"); } using var bmp = Image.FromHbitmap(s.unionmember); var ret = (Image)bmp.Clone(); return(ret); } finally { s.Dispose(); } }
public Image GetBitmap(FormatId id) { if (id == FormatId.CF_BITMAP) { return(GetBitmap()); } var f = id.FormatEtc; STGMEDIUM s = default; try { DataObject.GetData(ref f, out s); using var st = s.GetUnmanagedStream(true); using var bmp = Image.FromStream(st); var ret = (Image)bmp.Clone(); return(ret); } finally { s.Dispose(); } }
public (List <PIDL>, PIDL) GetShellIdList() { var f = FormatId.CFSTR_SHELLIDLIST.FormatEtc; STGMEDIUM s = default; try { DataObject.GetData(ref f, out s); return(s.InvokeHGlobal <uint, (List <PIDL>, PIDL)>(x => { var l = new List <PIDL>(); PIDL?parent = null; unsafe { fixed(void *ptr = x) { parent = new PIDL((IntPtr)((byte *)ptr + x[1]), true, true); for (var i = 1; i < x[0] + 1; i++) { // DO NOT release memory of child var child = new PIDL((IntPtr)((byte *)ptr + x[i + 1]), false, false); var p = new PIDL(parent); p.Append(child); l.Add(p); } } } return (l, parent); })); } finally { s.Dispose(); } }