How to get the screenshot of the form

后端 未结 8 866
悲&欢浪女
悲&欢浪女 2020-12-02 23:14

Any method to output the screenshot of an active form?

相关标签:
8条回答
  • 2020-12-02 23:42

    This will save a screenshot of your active window to your C: drive.

    The SendKeys.Send("") is used to send keypresses to the computer. In this case % is used to press Alt and {PRTSC} obviously to press the Print Screen button on your keyboard.

    Hope this helps someone!

    private void printScreenButton_Click(object sender, EventArgs e)
    {
        SendKeys.Send("%{PRTSC}");
        Image img = Clipboard.GetImage();
        img.Save(@"C:\\testprintscreen.jpg");
    }
    
    0 讨论(0)
  • 2020-12-02 23:43

    Even simpler answer supported by .NET:

    Control.DrawToBitmap.

    0 讨论(0)
  • 2020-12-02 23:43
    here is:
    
    
    
    
           public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter
    
        [DllImport("gdi32.dll")]
        public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
            int nWidth, int nHeight, IntPtr hObjectSource,
            int nXSrc, int nYSrc, int dwRop);
    
        [DllImport("gdi32.dll")]
        public static extern bool StretchBlt(
              IntPtr hdcDest,      // handle to destination DC
              int nXOriginDest, // x-coord of destination upper-left corner
              int nYOriginDest, // y-coord of destination upper-left corner
              int nWidthDest,   // width of destination rectangle
              int nHeightDest,  // height of destination rectangle
              IntPtr hdcSrc,       // handle to source DC
              int nXOriginSrc,  // x-coord of source upper-left corner
              int nYOriginSrc,  // y-coord of source upper-left corner
              int nWidthSrc,    // width of source rectangle
              int nHeightSrc,   // height of source rectangle
              int dwRop       // raster operation code
            );
    
    
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,
            int nHeight);
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
        [DllImport("gdi32.dll")]
        public static extern bool DeleteDC(IntPtr hDC);
        [DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
        [DllImport("gdi32.dll")]
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
    
    
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }
    
        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();
        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowDC(IntPtr hWnd);
        [DllImport("user32.dll")]
        public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
    
        private void run_test()
        {
    
            Rectangle rc = new Rectangle();
            Image img = ScreenToImage(ref rc, false);
            img.Save(@"C:\Users\ssaamm\Desktop\Capt44ure.JPG", System.Drawing.Imaging.ImageFormat.Jpeg);
            img.Dispose();
    
        }
    
    
        private Image ScreenToImage(ref Rectangle rcDest, bool IsPapaer)
        {
            IntPtr handle = this.Handle;
    
            //this.Handle
            // get te hDC of the target window
            IntPtr hdcSrc = GetWindowDC(handle);
            // get the size
            RECT windowRect = new RECT();
            GetWindowRect(handle, ref windowRect);
            int nWidth = windowRect.right - windowRect.left;
            int nHeight = windowRect.bottom - windowRect.top;
    
            if (IsPapaer)
            {
                float fRate = (float)rcDest.Width / nWidth;
                //float fHeight = nHeight * fRate;
                //rcDest.Height = (int)(nHeight * fRate);
                //rcDest.Width = (int)(rcDest.Width);// * fRate);
                rcDest.X = 0;
                rcDest.Y = 0;
                rcDest.Height = (int)(nHeight * fRate);
                //rcDest.Width = (int)(nWidth * fRate);
            }
            else
            {
                rcDest.X = 0;
                rcDest.Y = 0;
                rcDest.Height = nHeight;
                rcDest.Width = nWidth;
            }
    
            // create a device context we can copy to
            IntPtr hdcDest = CreateCompatibleDC(hdcSrc);
            // create a bitmap we can copy it to,
            // using GetDeviceCaps to get the width/height
            IntPtr hBitmap = CreateCompatibleBitmap(hdcSrc, rcDest.Width, rcDest.Height);
            // select the bitmap object
            IntPtr hOld = SelectObject(hdcDest, hBitmap);
            // bitblt over
            StretchBlt(hdcDest, rcDest.X, rcDest.Y, rcDest.Width, rcDest.Height, hdcSrc, 0, 0, nWidth, nHeight, SRCCOPY);
            // restore selection
            SelectObject(hdcDest, hOld);
            // clean up 
            DeleteDC(hdcDest);
            ReleaseDC(handle, hdcSrc);
    
            // get a .NET image object for it
            Image img = Image.FromHbitmap(hBitmap);
            // free up the Bitmap object
            DeleteObject(hBitmap);
            return img;
        }
    
    0 讨论(0)
  • 2020-12-02 23:49
             this.Opacity = 0;
            Rectangle bounds = Screen.GetBounds(Point.Empty);
    
            // create the bitmap to copy the screen shot to
            Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
    
            // now copy the screen image to the graphics device from the bitmap
            using (Graphics gr = Graphics.FromImage(bitmap))
            {
    
                gr.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);          
            }
            this.Opacity = 100;
    

    Now just

            gr.Save(@"c\pic.jpg",ImageFormat.jpg);
    
    0 讨论(0)
  • 2020-12-02 23:52

    Because Control.DrawToBitmap has some limitations (most notably drawing child controls in reverse order) I have made this alternative. The variable _control is the WinForms Control/Form that you want to copy.

    using (Bitmap bitmap = new Bitmap(width, height)) {
        using (Graphics gb = Graphics.FromImage(bitmap))
        using (Graphics gc = Graphics.FromHwnd(_control.Handle)) {
    
              IntPtr hdcDest = IntPtr.Zero;
              IntPtr hdcSrc = IntPtr.Zero;
    
              try {
                  hdcDest = gb.GetHdc();
                  hdcSrc = gc.GetHdc();
    
                  BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, SRC_COPY);
              } finally {
                  if (hdcDest != IntPtr.Zero) gb.ReleaseHdc(hdcDest);
                  if (hdcSrc != IntPtr.Zero) gc.ReleaseHdc(hdcSrc);
              }
          }
    
          bitmap.Save(...);
    }
    
    [DllImport("gdi32.dll", EntryPoint = "BitBlt")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool BitBlt(
        [In()] System.IntPtr hdc, int x, int y, int cx, int cy,
        [In()] System.IntPtr hdcSrc, int x1, int y1, uint rop);
    
    private const int SRC_COPY = 0xCC0020;
    
    0 讨论(0)
  • 2020-12-02 23:53

    Here's an extension method you can use:

        #region Interop
    
        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr hdc, PRF_FLAGS drawingOptions);
    
        const uint WM_PRINT = 0x317;
    
        [Flags]
        enum PRF_FLAGS : uint
        {
            CHECKVISIBLE = 0x01,
            CHILDREN = 0x02,
            CLIENT = 0x04,
            ERASEBKGND = 0x08,
            NONCLIENT = 0x10,
            OWNED = 0x20
        }
    
        #endregion
    
        public static Image CaptureImage(this Control control)
        {
            Image img = new Bitmap(control.Width, control.Height);
            using (Graphics g = Graphics.FromImage(img))
            {
                SendMessage(
                   control.Handle,
                   WM_PRINT,
                   g.GetHdc(),
                   PRF_FLAGS.CLIENT | PRF_FLAGS.NONCLIENT | PRF_FLAGS.ERASEBKGND);
            }
            return img;
        }
    

    Form inherits from Control, so you can use it on a form too.

    0 讨论(0)
提交回复
热议问题