C# 非顶端窗口截图

您所在的位置:网站首页 windows窗口抓图 C# 非顶端窗口截图

C# 非顶端窗口截图

2024-05-07 12:06| 来源: 网络整理| 查看: 265

原文地址:http://blog.csdn.net/u013096568/article/details/53400389

panel上可以通过DrawToBitmap截图,不管是否在屏幕外是否有遮挡         

Bitmap sourceBitmap = new Bitmap(400, 300); //Control ct = frmMain.mianForm.panel1 as Control; //ct.DrawToBitmap(sourceBitmap, new System.Drawing.Rectangle(0, 0, 400, 300)); panel1.DrawToBitmap(sourceBitmap, new System.Drawing.Rectangle(0, 0, 400, 300)); sourceBitmap.Save(@"e:\123form2.bmp");

在图片上打水印

string strpath = @"e:\1.bmp"; Bitmap bmp = new Bitmap(strpath); Graphics graphics = Graphics.FromImage(bmp); System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red); graphics.FillEllipse(myBrush, new System.Drawing.Rectangle(150, 200, 10, 10));//画圆 try { bmp.Save(@"e:\new.bmp"); } catch (Exception ex) { MessageBox.Show(ex.Message); }

  

抓屏截图         

Image objImage = new Bitmap(400, 300); Graphics g = Graphics.FromImage(objImage); g.CopyFromScreen(new System.Drawing.Point(Cursor.Position.X - 150, Cursor.Position.Y - 25), new System.Drawing.Point(0, 0), new Size(400, 300)); IntPtr dc1 = g.GetHdc(); g.ReleaseHdc(dc1); objImage.Save("e:\\test.jpg");

  

非顶端窗口截图

用Windows热键截图然后保存的我就不说了,地球人都知道.

如何截取非前端窗体的截图,要先获取所要截图的窗口的句柄IntPtr PicWindow = this.Handle

首先说一下PrintWindow这个API的使用

      

public static Bitmap GetWindowCapture(IntPtr hWnd) { IntPtr hscrdc = GetWindowDC(hWnd); RECT windowRect = new RECT(); GetWindowRect(hWnd, ref windowRect); int width = windowRect.right - windowRect.left; int height = windowRect.bottom - windowRect.top; IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, width, height); IntPtr hmemdc = CreateCompatibleDC(hscrdc); SelectObject(hmemdc, hbitmap); PrintWindow(hWnd, hmemdc, 0); Bitmap bmp = Bitmap.FromHbitmap(hbitmap); DeleteDC(hscrdc);//删除用过的对象 DeleteDC(hmemdc);//删除用过的对象 return bmp; } [DllImport("user32.dll")] public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect); [DllImport("gdi32.dll")] public static extern IntPtr CreateDC( string lpszDriver, // driver name驱动名 string lpszDevice, // device name设备名 string lpszOutput, // not used; should be NULL IntPtr lpInitData // optional printer data ); [DllImport("gdi32.dll")] public static extern int BitBlt( IntPtr hdcDest, // handle to destination DC目标设备的句柄 int nXDest, // x-coord of destination upper-left corner目标对象的左上角的X坐标 int nYDest, // y-coord of destination upper-left corner目标对象的左上角的Y坐标 int nWidth, // width of destination rectangle目标对象的矩形宽度 int nHeight, // height of destination rectangle目标对象的矩形长度 IntPtr hdcSrc, // handle to source DC源设备的句柄 int nXSrc, // x-coordinate of source upper-left corner源对象的左上角的X坐标 int nYSrc, // y-coordinate of source upper-left corner源对象的左上角的Y坐标 UInt32 dwRop // raster operation code光栅的操作值 ); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleDC( IntPtr hdc // handle to DC ); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleBitmap( IntPtr hdc, // handle to DC int nWidth, // width of bitmap, in pixels int nHeight // height of bitmap, in pixels ); [DllImport("gdi32.dll")] public static extern IntPtr SelectObject( IntPtr hdc, // handle to DC IntPtr hgdiobj // handle to object ); [DllImport("gdi32.dll")] public static extern int DeleteDC( IntPtr hdc // handle to DC ); [DllImport("user32.dll")] public static extern bool PrintWindow( IntPtr hwnd, // Window to copy,Handle to the window that will be copied. IntPtr hdcBlt, // HDC to print into,Handle to the device context. UInt32 nFlags // Optional flags,Specifies the drawing options. It can be one of the following values. ); [DllImport("user32.dll")] public static extern IntPtr GetWindowDC( IntPtr hwnd );

  

很遗憾,上面的确可以截取非前端窗体的截图,但是非GDI的程序是无法截图的比如DirectX

 

下面说一下BitBlt这个API的使用

   

/// /// 提供全屏和指定窗口的截图 以及保存为文件的类 /// public class ScreenCapture { /// /// 全屏截图 /// /// public Image CaptureScreen() { return CaptureWindow(User32.GetDesktopWindow()); } /// /// 指定窗口截图 /// /// 窗口句柄. (在windows应用程序中, 从Handle属性获得) /// 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);

  



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3