用截取窗口图像的方法,获得指定窗口的图像信息,但当窗口被挡住时,截取错误。以下是代码,
如果窗口没有被挡住,截取正确,被挡住就错误了,求高手指教!            Graphics g1 = pictureBox1.CreateGraphics();
            int iWidth = pictureBox1.Width;
            int iHeight = pictureBox1.Height;            Image MyImage = new Bitmap(pictureBox1.Width, pictureBox1.Height, g1);
            Graphics g2 = Graphics.FromImage(MyImage);
            //得到屏幕的DC
            IntPtr dc1 = g1.GetHdc();
            //得到Bitmap的DC 
            IntPtr dc2 = g2.GetHdc();            BitBlt(dc2, 0, 0, pictureBox1.Width, pictureBox1.Height, dc1, 0, 0, 13369376);            //释放掉屏幕的DC
            g1.ReleaseHdc(dc1);
            //释放掉Bitmap的DC
            g2.ReleaseHdc(dc2);            //MyImage.Save(@"d:\Capture.jpg"/*, ImageFormat.Jpeg*/); 
            Clipboard.SetImage(MyImage);

解决方案 »

  1.   

    该窗口全部被picturebox控件覆盖,picturebox上有其它类型控件,例如button,label等,并且picturebox的paint消息中有画线或者写入字符串到窗口上。
      

  2.   

    我遇到这样子的一个软件,该窗体应该被pictureBox覆盖,上面有其它控件,在把它打开后,无论你怎么改变窗体大小,上面的图像,还是把它拉到windows下,按剪切板功能都能把改变后的窗体copy到剪切板中,所以请教大家有没有接触过这类问题?
      

  3.   

    用下面的方法,当窗体是父窗口时就可以截取windows下的,但子窗体不行,哪位高手指点一下?
            public static Bitmap GetWindow(IntPtr hWnd)
            {
                IntPtr hscrdc = GetWindowDC(hWnd);
                Control control = Control.FromHandle(hWnd);
                IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, control.Width, control.Height);
                IntPtr hmemdc = CreateCompatibleDC(hscrdc);
                SelectObject(hmemdc, hbitmap);
                PrintWindow(hWnd, hmemdc, 0);
                Bitmap bmp = Bitmap.FromHbitmap(hbitmap);
                DeleteDC(hscrdc);//删除用过的对象
                DeleteDC(hmemdc);//删除用过的对象
                return bmp;
            }
      

  4.   

    上述方法可以截取到父窗口被windows挡住的部分,但不能截取子窗口被父窗口挡住的部分,挡住的部分是黑色的,哪位知道?真的没有人知道么?