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 · 最后更改: 2023/01/03 15:25 由 127.0.0.1
评论