怎样能把别的程序的窗体的样子保存为图片?
要窗体被其它的穿体覆盖的时候不要看到覆盖的穿体!
好象用getdc()函数,把覆盖的窗体也保存在一起了
大哥们,小弟先谢谢了

解决方案 »

  1.   

    得到窗口的工作区,然后用BITBLT函数保存到图片
      

  2.   

    看看这个,改改就能用using System ;
    using System.Drawing ;
    using System.Collections ;
    using System.ComponentModel ;
    using System.Windows.Forms ;
    using System.Data ;
    using System.Drawing.Imaging ;
    public class Form1 : Form
    {
        private Button button1 ;
        private System.ComponentModel.Container components = null ;
        
        public Form1 ( )
        {
            //初始化窗体中的各个组件
            InitializeComponent ( ) ;
        }
        // 清除程序中使用过的资源
        protected override void Dispose ( bool disposing )
        {
            if ( disposing )
            {
                if ( components != null )
                {
                    components.Dispose ( ) ;
                }
            }
            base.Dispose ( disposing ) ;
        }
        private void InitializeComponent ( )
        {
            button1 = new Button ( );
            SuspendLayout ( ) ;
            button1.Location = new System.Drawing.Point ( 64 , 40 ) ;
            button1.Name = "button1" ;
            button1.Size = new System.Drawing.Size ( 80 , 32 ) ;
            button1.TabIndex = 0 ;
            button1.Text = "捕获" ;
            button1.Click += new System.EventHandler ( button1_Click ) ;
            
            AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
            ClientSize = new System.Drawing.Size ( 216 , 125 ) ;
            Controls.Add  ( button1 ) ;
            MaximizeBox = false ;
            MinimizeBox = false ;
            Name = "Form1" ;
            Text = "C#捕获当前屏幕!" ;
            ResumeLayout ( false ) ;
            
        }
        //声明一个API函数
        [ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
        private static extern bool BitBlt (
                                           IntPtr hdcDest , // 目标 DC的句柄
                                           int nXDest ,
                                           int nYDest ,
                                           int nWidth ,
                                           int nHeight ,
                                           IntPtr hdcSrc ,  // 源DC的句柄
                                           int nXSrc ,
                                           int nYSrc ,
                                           System.Int32 dwRop  // 光栅的处理数值
                                          ) ;
        
        static void Main ( )
        {
            Application.Run ( new Form1 ( ) ) ;
        }
        private void button1_Click ( object sender , System.EventArgs e )
        {
            //获得当前屏幕的大小
            Rectangle rect = new Rectangle ( ) ;
            rect = Screen.GetWorkingArea ( this ) ;
            //创建一个以当前屏幕为模板的图象
            Graphics g1 = this.CreateGraphics ( ) ;
            //创建以屏幕大小为标准的位图
            Image MyImage = new Bitmap ( rect.Width , rect.Height , g1 ) ;
            Graphics g2 = Graphics.FromImage ( MyImage ) ;
            //得到屏幕的DC
            IntPtr dc1 = g1.GetHdc ( ) ;
            //得到Bitmap的DC
            IntPtr dc2 = g2.GetHdc ( ) ;
            //调用此API函数,实现屏幕捕获
            BitBlt ( dc2 , 0 , 0 , rect.Width , rect.Height , dc1 , 0 , 0 , 13369376 ) ;
            //释放掉屏幕的DC
            g1.ReleaseHdc ( dc1 ) ;
            //释放掉Bitmap的DC
            g2.ReleaseHdc ( dc2 ) ;
            //以JPG文件格式来保存
            MyImage.Save ( @"c:\Capture.jpg" , ImageFormat.Jpeg );
            MessageBox.Show ( "当前屏幕已经保存为C盘的capture.jpg文件!" ) ;
        }
    }