C#屏幕截图,控件截图程序
//http://cherishlc.iteye.com/blog/1687738
1 using System; 2 using System.Collections.Generic; 3 using System.Drawing; 4 using System.Linq; 5 using System.Runtime.InteropServices; 6 using System.Text; 7 using System.Threading.Tasks; 8 using System.Windows.Forms; 9 10 namespace LC 11 { 12 class ScreenCapture 13 { 14 #region 抓取屏幕 15 /// <summary> 16 /// 抓取屏幕(层叠的窗口) 17 /// </summary> 18 /// <param name="x">左上角的横坐标</param> 19 /// <param name="y">左上角的纵坐标</param> 20 /// <param name="width">抓取宽度</param> 21 /// <param name="height">抓取高度</param> 22 /// <returns></returns> 23 public static Bitmap captureScreen(int x, int y, int width, int height) 24 { 25 Bitmap bmp = new Bitmap(width, height); 26 using (Graphics g = Graphics.FromImage(bmp)) 27 { 28 g.CopyFromScreen(new Point(x, y), new Point(0, 0), bmp.Size); 29 g.Dispose(); 30 } 31 //bit.Save(@"capture2.png"); 32 return bmp; 33 } 34 35 /// <summary> 36 /// 抓取整个屏幕 37 /// </summary> 38 /// <returns></returns> 39 public static Bitmap captureScreen() 40 { 41 Size screenSize = Screen.PrimaryScreen.Bounds.Size; 42 return captureScreen(0,0,screenSize.Width,screenSize.Height); 43 } 44 #endregion 45 46 #region 使用BitBlt方法抓取控件,无论控件是否被遮挡 47 /// <summary> 48 /// 控件(窗口)的截图,控件被其他窗口(而非本窗口内控件)遮挡时也可以正确截图,使用BitBlt方法 49 /// </summary> 50 /// <param name="control">需要被截图的控件</param> 51 /// <returns>该控件的截图,控件被遮挡时也可以正确截图</returns> 52 public static Bitmap captureControl(Control control) 53 { 54 //调用API截屏 55 IntPtr hSrce = GetWindowDC(control.Handle); 56 IntPtr hDest = CreateCompatibleDC(hSrce); 57 IntPtr hBmp = CreateCompatibleBitmap(hSrce, control.Width, control.Height); 58 IntPtr hOldBmp = SelectObject(hDest, hBmp); 59 if (BitBlt(hDest, 0, 0, control.Width, control.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt)) 60 { 61 Bitmap bmp = Image.FromHbitmap(hBmp); 62 SelectObject(hDest, hOldBmp); 63 DeleteObject(hBmp); 64 DeleteDC(hDest); 65 ReleaseDC(control.Handle, hSrce); 66 // bmp.Save(@"a.png"); 67 // bmp.Dispose(); 68 return bmp; 69 } 70 return null; 71 72 } 73 74 #endregion 75 76 77 #region 使用PrintWindow方法抓取窗口,无论控件是否被遮挡 78 /// <summary> 79 /// 窗口的截图,窗口被遮挡时也可以正确截图,使用PrintWindow方法 80 /// </summary> 81 /// <param name="control">需要被截图的窗口</param> 82 /// <returns>窗口的截图,控件被遮挡时也可以正确截图</returns> 83 public static Bitmap captureWindowUsingPrintWindow(Form form) 84 { 85 return GetWindow(form.Handle); 86 } 87 88 89 private static Bitmap GetWindow(IntPtr hWnd) 90 { 91 IntPtr hscrdc = GetWindowDC(hWnd); 92 Control control = Control.FromHandle(hWnd); 93 IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, control.Width, control.Height); 94 IntPtr hmemdc = CreateCompatibleDC(hscrdc); 95 SelectObject(hmemdc, hbitmap); 96 PrintWindow(hWnd, hmemdc, 0); 97 Bitmap bmp = Bitmap.FromHbitmap(hbitmap); 98 DeleteDC(hscrdc);//删除用过的对象 99 DeleteDC(hmemdc);//删除用过的对象 100 return bmp; 101 } 102 #endregion 103 104 #region DLL calls 105 [DllImport("gdi32.dll")] 106 static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int 107 wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop); 108 [DllImport("gdi32.dll")] 109 static extern IntPtr DeleteDC(IntPtr hDc); 110 [DllImport("gdi32.dll")] 111 static extern IntPtr DeleteObject(IntPtr hDc); 112 [DllImport("gdi32.dll")] 113 static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); 114 [DllImport("gdi32.dll")] 115 static extern IntPtr CreateCompatibleDC(IntPtr hdc); 116 [DllImport("gdi32.dll")] 117 static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); 118 [DllImport("user32.dll")] 119 public static extern IntPtr GetDesktopWindow(); 120 [DllImport("user32.dll")] 121 public static extern IntPtr GetWindowDC(IntPtr ptr); 122 [DllImport("user32.dll")] 123 public static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, UInt32 nFlags); 124 [DllImport("user32.dll")] 125 static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc); 126 #endregion 127 } 128 }