我的代码如下:
            if (!OpenClipboard(IntPtr.Zero))
                return;            IntPtr data = data = GetClipboardData((uint)CLIPFORMAT.CF_METAFILEPICT);            if (data != IntPtr.Zero)
            {
                Graphics aa;
                METAFILEPICT mfpStruct = (METAFILEPICT)Marshal.PtrToStructure(data, typeof(METAFILEPICT));
                Metafile pMetaFile = new Metafile(mfpStruct.hMF, true);
            }
            
            CloseClipboard();不知道为什么,“Metafile pMetaFile = new Metafile(mfpStruct.hMF, true);”这句话总是报错,信息是“A generic error occurred in GDI+”,然后我又试了直接把data传入Metafile构造函数的第一个参数,可是还是报错,请教啊下面是上面用到的一些函数、结构的声明
        #region win32 api声明
        [DllImport("user32.dll")]
        static extern bool OpenClipboard(IntPtr hWndNewOwner);
        [DllImport("user32.dll")]
        static extern bool CloseClipboard();
        [DllImport("user32.dll")]
        static extern IntPtr GetClipboardData(uint uFormat);
        #endregion        #region 剪切板格式
        internal enum CLIPFORMAT : uint
        {
            CF_TEXT = 1,
            CF_BITMAP = 2,
            CF_METAFILEPICT = 3,
            CF_SYLK = 4,
            CF_DIF = 5,
            CF_TIFF = 6,
            CF_OEMTEXT = 7,
            CF_DIB = 8,
            CF_PALETTE = 9,
            CF_PENDATA = 10,
            CF_RIFF = 11,
            CF_WAVE = 12,
            CF_UNICODETEXT = 13,
            CF_ENHMETAFILE = 14,
            CF_HDROP = 15,
            CF_LOCALE = 16,
            CF_MAX = 17,
            CF_OWNERDISPLAY = 0x80,
            CF_DSPTEXT = 0x81,
            CF_DSPBITMAP = 0x82,
            CF_DSPMETAFILEPICT = 0x83,
            CF_DSPENHMETAFILE = 0x8E,
        }
        #endregion        #region 结构声明
        public struct METAFILEPICT
        {
            public int mm;
            public int xExt;
            public int yExt;
            public IntPtr hMF;
        }
        #endregion

解决方案 »

  1.   

    你先看看存到clipboard中的数据类型是什么
      

  2.   

    我刚在写这个程序的时候,第一点观查的就是数据类型了。。我可以100%肯定是CF_METAFILEPICT
      

  3.   

    如果抓取得是图片的话,可以如下:
    IDataObject data = Clipboard.GetDataObject();object oimg = data.GetData( "GIF+Office Art" );
    MemoryStream ms = oimg as MemoryStream;
    Image img = null;
    if( ms != null )
    {
    img = Image.FromStream( ms );
            ms.Close();
    }img.Save( "C:\\1.jpg" , ImageFormat.Jpeg );
      

  4.   

    Sorry!
    IDataObject data = Clipboard.GetDataObject();object oimg = data.GetData( "GIF+Office Art" );
    MemoryStream ms = oimg as MemoryStream;
    Image img = null;
    if( ms != null )
    {
    img = Image.FromStream( ms );
    }img.Save( "C:\\1.jpg" , ImageFormat.Jpeg );
      

  5.   

    IDataObject iData = Clipboard.GetDataObject();
    //最好判断一些是不是图片
       if (iData.GetDataPresent(DataFormats.Bitmap))
       {  
        Bitmap bit = (Bitmap)iData.GetData(DataFormats.Bitmap);
        bit.Save(...)
       }
       
      

  6.   

    我这里跑你的代码的这句就返回null了,“IDataObject data = Clipboard.GetDataObject();”
      

  7.   

    我在控制台下面跑就返回null,我再去win form程序里跑就可以了,可是发现,你的代码只是保存剪切板数据为Bitmap的
      

  8.   

    CF_METAFILEPICT,我不是用程序存的,而是手动去弄的,再说实一点,我是在wpp里面弄的,而恰好这个功能在ppt时面是没有的。。
      

  9.   

    我x ta妈de,终于解决了,我想过了,我一定要去x篇blog出来,操