Получение изображения, перетащенного с веб-страницы в окно WPF

Я хочу, чтобы мое WPF-приложение было объектом падения, и я хочу иметь возможность перетаскивать изображение с любой веб-страницы.

Когда изображение перетаскивается с веб-страницы, очевидно, оно находится в формате "DragImageBits", который может быть десериализован до типа ShDragImage. (См. внизу вопроса, как я его определил)

Как мне преобразовать его в изображение WPF?

Вот моя текущая попытка. (Если кто знает правильный способ десириализации, я весь внимание)

   private void UserControl_Drop(object sender, System.Windows.DragEventArgs e)
    {

            string[] formats = data.GetFormats();

            // DragImageBits
            if (formats.Contains("DragImageBits"))
            {
            MemoryStream imageStream = data.GetData("DragImageBits") as MemoryStream;

            // Now I'm deserializing this, the only way I know how
            imageStream.Seek(0, SeekOrigin.Begin);
            BinaryReader br = new BinaryReader(imageStream);

            ShDragImage shDragImage;
            shDragImage.sizeDragImage.cx = br.ReadInt32();
            shDragImage.sizeDragImage.cy = br.ReadInt32();
            shDragImage.ptOffset.x = br.ReadInt32();
            shDragImage.ptOffset.y = br.ReadInt32();
            shDragImage.hbmpDragImage = new IntPtr(br.ReadInt32());
            shDragImage.crColorKey = br.ReadInt32();


            var systemDrawingBitmap = System.Drawing.Bitmap.FromHbitmap(shDragImage.hbmpDragImage);

В этот момент я получаю исключение типа System.Runtime.InteropServices.ExternalException, с сообщением просто Generic GDI+ error.

Кто-нибудь знает, что мне делать?


А вот определения вспомогательных классов. Я скопировал их из этой записи в блоге.

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct Win32Point
    {
        public int x;
        public int y;
    }

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct Win32Size
    {
        public int cx;
        public int cy;
    }

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct ShDragImage
    {
        public Win32Size sizeDragImage;
        public Win32Point ptOffset;
        public IntPtr hbmpDragImage;
        public int crColorKey;
    }

13
задан Andrew Shepherd 9 December 2011 в 22:46
поделиться