Пример #1
0
        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();
            }
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
        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();
            }
        }
Пример #4
0
        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();
            }
        }
Пример #5
0
        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();
            }
        }
Пример #6
0
        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();
            }
        }
Пример #7
0
        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();
            }
        }