ColinOL

A Small Website

用户工具

站点工具


wiki:csharp:winform-pingmujieping

屏幕截屏

screencapture.cs
/// <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);
        User32.ReleaseDC(handle,hdcSrc);
        Image img = Image.FromHbitmap(hBitmap);
        GDI32.DeleteObject(hBitmap);
        return img;
    }
    /// <summary>
    /// 指定窗口截图 保存为图片文件
    /// </summary>
    /// <param name="handle"></param>
    /// <param name="filename"></param>
    /// <param name="format"></param>
    public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format)
    {
        Image img = CaptureWindow(handle);
        img.Save(filename,format);
    }
    /// <summary>
    /// 全屏截图 保存为文件
    /// </summary>
    /// <param name="filename"></param>
    /// <param name="format"></param>
    public void CaptureScreenToFile(string filename, ImageFormat format)
    {
        Image img = CaptureScreen();
        img.Save(filename,format);
    }
 
    /// <summary>
    /// 辅助类 定义 Gdi32 API 函数
    /// </summary>
    private class GDI32
    {
 
        public const int SRCCOPY = 0x00CC0020;
        [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 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);
    }
 
    /// <summary>
    /// 辅助类 定义User32 API函数
    /// </summary>
    private class User32
    {
        [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);
    }
}
wiki/csharp/winform-pingmujieping.txt · 最后更改: 2018/02/03 20:42 (外部编辑)