• C# 非顶端窗口截图


    原文地址:http://blog.csdn.net/u013096568/article/details/53400389

    panel上可以通过DrawToBitmap截图,不管是否在屏幕外是否有遮挡         

     Bitmap sourceBitmap = new Bitmap(400, 300);
                //Control ct = frmMain.mianForm.panel1 as Control;
    
                //ct.DrawToBitmap(sourceBitmap, new System.Drawing.Rectangle(0, 0, 400, 300));
                panel1.DrawToBitmap(sourceBitmap, new System.Drawing.Rectangle(0, 0, 400, 300));
                sourceBitmap.Save(@"e:123form2.bmp");

    在图片上打水印

    string strpath = @"e:1.bmp";
                Bitmap bmp = new Bitmap(strpath);
                Graphics graphics = Graphics.FromImage(bmp);
    
                System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
                graphics.FillEllipse(myBrush, new System.Drawing.Rectangle(150, 200, 10, 10));//画圆
    
                try
                {
                    bmp.Save(@"e:
    ew.bmp");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
    

      

    抓屏截图
             

       Image objImage = new Bitmap(400, 300);
                Graphics g = Graphics.FromImage(objImage);
                g.CopyFromScreen(new System.Drawing.Point(Cursor.Position.X - 150, Cursor.Position.Y - 25), new System.Drawing.Point(0, 0), new Size(400, 300));
                IntPtr dc1 = g.GetHdc();
                g.ReleaseHdc(dc1);
    
                objImage.Save("e:\test.jpg");
    

      

    非顶端窗口截图

    用Windows热键截图然后保存的我就不说了,地球人都知道.

    如何截取非前端窗体的截图,要先获取所要截图的窗口的句柄IntPtr PicWindow = this.Handle

    首先说一下PrintWindow这个API的使用

          

      public static Bitmap GetWindowCapture(IntPtr hWnd)
            {
                IntPtr hscrdc = GetWindowDC(hWnd);
                RECT windowRect = new RECT();
                GetWindowRect(hWnd, ref windowRect);
                int width = windowRect.right - windowRect.left;
                int height = windowRect.bottom - windowRect.top;
    
                IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, width, height);
                IntPtr hmemdc = CreateCompatibleDC(hscrdc);
                SelectObject(hmemdc, hbitmap);
                PrintWindow(hWnd, hmemdc, 0);
                Bitmap bmp = Bitmap.FromHbitmap(hbitmap);
                DeleteDC(hscrdc);//删除用过的对象
                DeleteDC(hmemdc);//删除用过的对象
                return bmp;
            }
    
            [DllImport("user32.dll")]
            public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
    
            [DllImport("gdi32.dll")]
            public static extern IntPtr CreateDC(
             string lpszDriver,         // driver name驱动名
             string lpszDevice,         // device name设备名
             string lpszOutput,         // not used; should be NULL
             IntPtr lpInitData   // optional printer data
             );
            [DllImport("gdi32.dll")]
            public static extern int BitBlt(
             IntPtr hdcDest, // handle to destination DC目标设备的句柄
             int nXDest,   // x-coord of destination upper-left corner目标对象的左上角的X坐标
             int nYDest,   // y-coord of destination upper-left corner目标对象的左上角的Y坐标
             int nWidth,   // width of destination rectangle目标对象的矩形宽度
             int nHeight, // height of destination rectangle目标对象的矩形长度
             IntPtr hdcSrc,   // handle to source DC源设备的句柄
             int nXSrc,    // x-coordinate of source upper-left corner源对象的左上角的X坐标
             int nYSrc,    // y-coordinate of source upper-left corner源对象的左上角的Y坐标
             UInt32 dwRop   // raster operation code光栅的操作值
             );
    
            [DllImport("gdi32.dll")]
            public static extern IntPtr CreateCompatibleDC(
             IntPtr hdc // handle to DC
             );
    
            [DllImport("gdi32.dll")]
            public static extern IntPtr CreateCompatibleBitmap(
             IntPtr hdc,         // handle to DC
             int nWidth,      // width of bitmap, in pixels
             int nHeight      // height of bitmap, in pixels
             );
    
            [DllImport("gdi32.dll")]
            public static extern IntPtr SelectObject(
             IntPtr hdc,           // handle to DC
             IntPtr hgdiobj    // handle to object
             );
    
            [DllImport("gdi32.dll")]
            public static extern int DeleteDC(
             IntPtr hdc           // handle to DC
             );
    
            [DllImport("user32.dll")]
            public static extern bool PrintWindow(
             IntPtr hwnd,                // Window to copy,Handle to the window that will be copied.
             IntPtr hdcBlt,              // HDC to print into,Handle to the device context.
             UInt32 nFlags               // Optional flags,Specifies the drawing options. It can be one of the following values.
             );
    
            [DllImport("user32.dll")]
            public static extern IntPtr GetWindowDC(
             IntPtr hwnd
             );
    

      

    很遗憾,上面的确可以截取非前端窗体的截图,但是非GDI的程序是无法截图的比如DirectX

    下面说一下BitBlt这个API的使用

       

      /// <summary>
        /// 提供全屏和指定窗口的截图 以及保存为文件的类
        /// </summary>
        public class ScreenCapture
        {
            /// <summary>
            /// 全屏截图
            /// </summary>
            /// <returns></returns>
            public Image CaptureScreen()
            {
                return CaptureWindow(User32.GetDesktopWindow());
            }
            /// <summary>
            /// 指定窗口截图
            /// </summary>
            /// <param name="handle">窗口句柄. (在windows应用程序中, 从Handle属性获得)</param>
            /// <returns></returns>
            public Image CaptureWindow(IntPtr handle)
            {
                IntPtr hdcSrc = User32.GetWindowDC(handle);
                User32.RECT windowRect = new User32.RECT();
                User32.GetWindowRect(handle, ref windowRect);
                int width = windowRect.right - windowRect.left;
                int height = windowRect.bottom - windowRect.top;
                IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
                IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
                IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
                GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
                GDI32.SelectObject(hdcDest, hOld);
                GDI32.DeleteDC(hdcDest);
            
    

      

  • 相关阅读:
    PHP新的垃圾回收机制:Zend GC详解
    SSH隧道技术简介
    mysql主从延迟
    非root配置linux下vim
    PHP 中的 9 个魔术方法
    PHP内核介绍及扩展开发指南—Extensions 的编写(下)
    PHP内核介绍及扩展开发指南—Extensions 的编写
    php 扩展开发
    php opcode
    rsa 数学推论
  • 原文地址:https://www.cnblogs.com/boonya/p/8548024.html
Copyright © 2020-2023  润新知