不会被其他窗体遮挡的抓图,使用API的PrintWindow函数

类别:.NET开发 点击:0 评论:0 推荐:

只要窗体的visable为true,即使它在屏幕的外面也可以抓到图。如果为false,就是一张黑图了,赫赫。
 
public 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;
  }

API声明

[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
   );

本文地址:http://com.8s8s.com/it/it42057.htm