private void button2_Click(object sender, EventArgs e)
        {
            Metafile metafile;//定义图形-图元文件
            Picture.Picture x = new Picture.Picture();//利用matlab生成的类
            x.pictureTest01();//生成图象,并复制在剪切板上
            IDataObject iData = Clipboard.GetDataObject();//从剪切板获取数据
            if (iData.GetDataPresent(DataFormats.MetafilePict))
            {
                object o = iData.GetData(DataFormats.MetafilePict);
                metafile = (Metafile)o;
                this.pictureBox1.Image = metafile;
            }
        }
代码如上所示。主要作用是利用matlab生成图象,并把图象copy在剪切板上,然后winform窗体从剪切板上读取该图象,并在GroupBox中显示出来。
我现在的问题是当 if 为真时,却无法获取到剪切板上的图元文件。即object o = iData.GetData(DataFormats.MetafilePict);时,o 总是为Null,请问各位朋友,这是什么原因?

解决方案 »

  1.   

    你先尝试在外部粘贴(例如WINDOWS画图板),看看能否获取图片,不排除你在设置剪贴板数据时就出的问题。
      

  2.   


    1、外部粘贴没有问题。
    2、另外,如果是jpg的格式,是可以读取并显示在picturebox中的。
      

  3.   

    那个DataFormats.MetafilePict是不是应该为DataFormats.MetafilePicture啊,你尝试下EnhancedMetafile格式和Bitmap格式,多加几个if 判断下,说不定那格式同时满足这几种,而你那个MetafilePicture是抓不到数据。实在不行就只能考虑利用API来直接抓取剪贴板二进制数据了。
      

  4.   


     bitmap格式不存在。
     EnhancedMetafile格式存在,但是读不到数据。
     MetafilePict格式存在,也读不到数据。
     
     看来,只能选择你说的API了,你能不能帮我提供一个思路,我以前没有进行过API方面的编程?
     真是多谢多谢你了
      

  5.   

    代码未测试,你自己试下,大致思路就是那样,想必你稍作改动应该能试出来。
        public enum ClipboardFormats : 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
        }
        public class ClipboardUtility
        {
            [DllImport("user32.dll")]
            private static extern bool OpenClipboard(IntPtr hWndNewOwner);        [DllImport("user32.dll")]
            private static extern bool EmptyClipboard();        [DllImport("user32.dll")]
            private static extern IntPtr GetClipboardData(uint uFormat);        [DllImport("user32.dll")]
            private static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem);        [DllImport("user32.dll")]
            private static extern bool CloseClipboard();        [DllImport("kernel32.dll")]
            private static extern UIntPtr GlobalSize(IntPtr hMem);        public static System.Drawing.Imaging.Metafile GetClipboardMETAFILEPICT()
            {
                OpenClipboard(IntPtr.Zero);
                IntPtr alloc = GetClipboardData((uint)ClipboardFormats.CF_METAFILEPICT);
                System.Drawing.Imaging.Metafile metafile = new System.Drawing.Imaging.Metafile(alloc,true);
                CloseClipboard();
                return metafile;
            }     
        }
      

  6.   


    你能帮我注释一下 System.Drawing.Imaging.Metafile GetClipboardMETAFILEPICT()这个方法里的语句么?
    我弄了好几个小时,还是弄不出来,然后在System.Drawing.Imaging.Metafile metafile = new System.Drawing.Imaging.Metafile(alloc,true);的时候出错,是参数无效的错误。麻烦你了,谢谢
      

  7.   

    那这样吧,
    IntPtr alloc = GetClipboardData((uint)ClipboardFormats.CF_METAFILEPICT);
    int size = (int)GlobalSize(alloc);你输出下那个size,看看是多少,如果获取到剪贴板内容,size肯定大于0.如果你有项目测试文件,特别是那个Picture.Picture及其相关类,我倒是可以帮你测试。相关文件可以发这里:[email protected]
      

  8.   


    SIZE是大于0的。错误又变成了GDI+中发生一般性错误。
    我把文件发到你邮箱了。你查收一下。
      

  9.   

    刚才我找了下C#的Metafile的创建方法,发现只要这样就可以获取图片了:
    this.pictureBox1.Image = Clipboard.GetImage();
      

  10.   


    对于图元文件格式的图象获取不到。JPEG的可以。但问题是MATLAB只能以图元格式复制到剪贴板。
      

  11.   

    经过各种蛋疼的测试 终于发现了这种方式来得到剪贴板的内容 并保存成图片文件
    object o = iData.GetData(DataFormats.MetafilePict);//这里得到MetafilePict
    Clipboard.SetData(DataFormats.Bitmap, o);//再向剪贴板里设置一次 设置成Bitmap
    o = iData.GetData(DataFormats.Bitmap);//然后再获取就可以了
    Bitmap bim =o as Bitmap  ;
    bim.Save("234.jpg");
      

  12.   


    在MATLAB R2012b中,Bitmap和Metafile都可以被剪切板获取的。
      

  13.   

    我也遇到了这个问题。
    我是这样来获取img的-。-
    Image img;
    //IDataObject idata = Clipboard.GetDataObject();
    img = Clipboard.GetImage();
    this.pictureBox1.Image = img;
    但是不行,加断点能走到这里,但是img是null。