zoukankan      html  css  js  c++  java
  • c#截屏功能的实现

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace LC
    {
    class ScreenCapture
    {
    #region 抓取屏幕
    /// <summary>
    /// 抓取屏幕(层叠的窗口)
    /// </summary>
    /// <param name="x">左上角的横坐标</param>
    /// <param name="y">左上角的纵坐标</param>
    /// <param name="width">抓取宽度</param>
    /// <param name="height">抓取高度</param>
    /// <returns></returns>
    public static Bitmap captureScreen(int x, int y, int width, int height)
    {
    Bitmap bmp = new Bitmap(width, height);
    using (Graphics g = Graphics.FromImage(bmp))
    {
    g.CopyFromScreen(new Point(x, y), new Point(0, 0), bmp.Size);
    g.Dispose();
    }
    //bit.Save(@"capture2.png");
    return bmp;
    }

    /// <summary>
    /// 抓取整个屏幕
    /// </summary>
    /// <returns></returns>
    public static Bitmap captureScreen()
    {
    Size screenSize = Screen.PrimaryScreen.Bounds.Size;
    return captureScreen(0,0,screenSize.Width,screenSize.Height);
    }
    #endregion

    #region 使用BitBlt方法抓取控件,无论控件是否被遮挡
    /// <summary>
    /// 控件(窗口)的截图,控件被其他窗口(而非本窗口内控件)遮挡时也可以正确截图,使用BitBlt方法
    /// </summary>
    /// <param name="control">需要被截图的控件</param>
    /// <returns>该控件的截图,控件被遮挡时也可以正确截图</returns>
    public static Bitmap captureControl(Control control)
    {
    //调用API截屏
    IntPtr hSrce = GetWindowDC(control.Handle);
    IntPtr hDest = CreateCompatibleDC(hSrce);
    IntPtr hBmp = CreateCompatibleBitmap(hSrce, control.Width, control.Height);
    IntPtr hOldBmp = SelectObject(hDest, hBmp);
    if (BitBlt(hDest, 0, 0, control.Width, control.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
    {
    Bitmap bmp = Image.FromHbitmap(hBmp);
    SelectObject(hDest, hOldBmp);
    DeleteObject(hBmp);
    DeleteDC(hDest);
    ReleaseDC(control.Handle, hSrce);
    // bmp.Save(@"a.png");
    // bmp.Dispose();
    return bmp;
    }
    return null;

    }

    // /// <summary>
    // /// 有问题!!!!!用户区域坐标不对啊
    // /// 控件(窗口)的用户区域截图,控件被其他窗口(而非本窗口内控件)遮挡时也可以正确截图,使用BitBlt方法
    // /// </summary>
    // /// <param name="control">需要被截图的控件</param>
    // /// <returns>控件(窗口)的用户区域截图</returns>
    // public static Bitmap captureClientArea(Control control)
    // {
    //
    // Size sz = control.Size;
    // Rectangle rect = control.ClientRectangle;
    //
    //
    // //调用API截屏
    // IntPtr hSrce = GetWindowDC(control.Handle);
    // IntPtr hDest = CreateCompatibleDC(hSrce);
    // IntPtr hBmp = CreateCompatibleBitmap(hSrce, rect.Width, rect.Height);
    // IntPtr hOldBmp = SelectObject(hDest, hBmp);
    // if (BitBlt(hDest, 0, 0, rect.Width, rect.Height, hSrce, rect.X, rect.Y, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt))
    // {
    // Bitmap bmp = Image.FromHbitmap(hBmp);
    // SelectObject(hDest, hOldBmp);
    // DeleteObject(hBmp);
    // DeleteDC(hDest);
    // ReleaseDC(control.Handle, hSrce);
    // // bmp.Save(@"a.png");
    // // bmp.Dispose();
    // return bmp;
    // }
    // return null;
    //
    // }
    #endregion


    #region 使用PrintWindow方法抓取窗口,无论控件是否被遮挡
    /// <summary>
    /// 窗口的截图,窗口被遮挡时也可以正确截图,使用PrintWindow方法
    /// </summary>
    /// <param name="control">需要被截图的窗口</param>
    /// <returns>窗口的截图,控件被遮挡时也可以正确截图</returns>
    public static Bitmap captureWindowUsingPrintWindow(Form form)
    {
    return GetWindow(form.Handle);
    }


    private 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;
    }
    #endregion

    #region DLL calls
    [DllImport("gdi32.dll")]
    static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
    wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
    [DllImport("gdi32.dll")]
    static extern IntPtr DeleteDC(IntPtr hDc);
    [DllImport("gdi32.dll")]
    static extern IntPtr DeleteObject(IntPtr hDc);
    [DllImport("gdi32.dll")]
    static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
    [DllImport("gdi32.dll")]
    static extern IntPtr CreateCompatibleDC(IntPtr hdc);
    [DllImport("gdi32.dll")]
    static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
    [DllImport("user32.dll")]
    public static extern IntPtr GetDesktopWindow();
    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowDC(IntPtr ptr);
    [DllImport("user32.dll")]
    public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, UInt32 nFlags);
    [DllImport("user32.dll")]
    static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
    #endregion
    }
    }

  • 相关阅读:
    Jmeter之http性能测试实战 非GUI模式压测 NON-GUI模式 结果解析TPS——干货(十一)
    UI Recorder 自动化测试 回归原理(九)
    UI Recorder 自动化测试 录制原理(八)
    UI Recorder 自动化测试 整体架构(七)
    UI Recorder 自动化测试 配置项(六)
    UI Recorder 自动化测试 工具栏使用(五)
    UI Recorder 自动化测试 回归测试(四)
    UI Recorder 自动化测试 录制(三)
    UI Recorder 自动化测试工具安装问题疑难杂症解决(二)
    UI Recorder 自动化测试安装教程(一)
  • 原文地址:https://www.cnblogs.com/mingyongcheng/p/3451208.html
Copyright © 2011-2022 走看看