抓屏(转)

using   System;  
  using   System.Windows.Forms;  
  using   System.Drawing;  
  using   System.Drawing.Imaging;  
  using   System.Runtime.InteropServices;  
   
   
  namespace   PrintScreen  
  {  
          //一部分代码来自网络  
          [StructLayout(LayoutKind.Sequential)]  
          public   struct   RECT    
          {  
                  public   int   left;  
                  public   int   top;  
                  public   int   right;  
                  public   int   bottom;  
          }    
          //封装一部分api的类  
          public   class   apitmp    
          {  
                  [DllImport("user32.dll")]  
                  public   static   extern   bool   GetCursorPos(ref   Point   lpPoint);  
                  [DllImport("user32.dll")]  
                  public   static   extern   int   WindowFromPoint(   Point   lpPoint);  
                  [DllImport("user32.dll")]  
                  public   static   extern   IntPtr   GetDesktopWindow();  
                  [DllImport("user32.dll")]  
                  public   static   extern   int   GetForegroundWindow();  
                  [DllImport("user32.dll")]  
                  public   static   extern   int   GetWindowRect(int   hwnd,   ref   RECT   rc);    
                  [DllImport("user32.dll")]  
                  public   static   extern   int   GetWindowDC(   int   hwnd);  
                  [DllImport("Gdi32.dll")]  
                  public   static   extern   bool   BitBlt   (  
                          IntPtr   hdcDest   ,   //   目标设备的句柄  
                          int   nXDest   ,   //   目标对象的左上角的X坐标  
                          int   nYDest   ,   //   目标对象的左上角的X坐标  
                          int   nWidth   ,   //   目标对象的矩形的宽度  
                          int   nHeight   ,   //   目标对象的矩形的长度  
                          IntPtr   hdcSrc   ,   //   源设备的句柄  
                          int   nXSrc   ,   //   源对象的左上角的X坐标  
                          int   nYSrc   ,   //   源对象的左上角的X坐标  
                          System.Int32   dwRop   //   光栅的操作值  
                          )   ;  
                  [DllImportAttribute   (   "gdi32.dll"   )   ]  
                  public   static   extern   IntPtr   CreateDC   (  
                          string   lpszDriver   ,   //   驱动名称  
                          string   lpszDevice   ,   //   设备名称  
                          string   lpszOutput   ,   //   无用,可以设定位"NULL"  
                          IntPtr   lpInitData   //   任意的打印机数据  
                          )   ;  
   
          }  
   
          //封装各种抓屏操作的类  
          public   class   UCapture    
          {  
                  //获得屏幕指定区域    
                  public   Bitmap   getscreen(int   left,int   top   ,int   width,int   height)  
                  {  
                          IntPtr   dc1   =   apitmp.CreateDC   (   "DISPLAY"   ,   null   ,   null   ,   (   IntPtr   )   null   )   ;  
                          Graphics   newGraphics   =   Graphics.FromHdc(dc1);  
                          Bitmap   img   =   new   Bitmap(width   ,   height   ,newGraphics);  
                          Graphics   thisGraphics   =   Graphics.FromImage(img);  
                          IntPtr   dc2   =thisGraphics.GetHdc();  
                          IntPtr   dc3   =   newGraphics.GetHdc();  
                          apitmp.BitBlt(dc2,0,0,width   ,   height   ,dc3,left,top,13369376);  
                          thisGraphics.ReleaseHdc(dc2);  
                          newGraphics.ReleaseHdc(dc3);  
                          return   img;  
                  }  
                  //获得整个屏幕  
                  public   Bitmap   getfullscreen()  
                  {  
                          return   getscreen(0,0,Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height);  
                  }  
                  //抓取句柄所指窗口  
                  public   Bitmap   getscreenfromhandle(int   hwnd)  
                  {  
                          RECT   rc   =   new   RECT();  
                          apitmp.GetWindowRect(hwnd,   ref   rc);  
                          return   getscreen(rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top);  
                  }  
                  //抓取

活动窗口  
                  public   Bitmap   getscreenfromactivewindow()  
                  {  
                          int   handle   =   apitmp.GetForegroundWindow();  
                          return   getscreenfromhandle(handle);  
                  }  
                  //保存成各种格式  
                  public   string   savepic(Bitmap   bmp)  
                  {  
                          SaveFileDialog   saveDialog   =   new   SaveFileDialog();  
                          saveDialog.Filter   =   "位图文件   (*.bmp)|*.bmp|jpg文件   (*.jpg)|*.jpg|gif文件   (*.gif)|*.gif|tiff文件   (*.tiff)|*.tiff|"+  
                                  "emf文件   (*.emf)|*.emf|图标文件   (*.ico)|*.ico|wmf文件   (*.wmf)|*.wmf|png文件   (*.png)|*.png";  
                          saveDialog.DefaultExt="*.bmp";  
                          if(saveDialog.ShowDialog()   ==   DialogResult.OK)  
                          {  
                                  string   ext   =   saveDialog.FileName.Substring(saveDialog.FileName.Length-4,4);  
                                  switch(   ext)  
                                  {    
                                          case   ".bmp":  
                                                  bmp.Save(saveDialog.FileName,ImageFormat.Bmp);  
                                                  break;    
                                          case   ".gif":    
                                                  bmp.Save(saveDialog.FileName,ImageFormat.Gif);  
                                                  break;  
                                          case   ".jpg":    
                                                  bmp.Save(saveDialog.FileName,ImageFormat.Jpeg);  
                                                  break;  
                                          case   ".emf":  
                                                  bmp.Save(saveDialog.FileName,ImageFormat.Emf);  
                                                  break;    
                                          case   ".ico":    
                                                  bmp.Save(saveDialog.FileName,ImageFormat.Icon);  
                                                  break;  
                                          case   ".wmf":    
                                                  bmp.Save(saveDialog.FileName,ImageFormat.Wmf);  
                                                  break;  
                                          case   ".png":    
                                                  bmp.Save(saveDialog.FileName,ImageFormat.Png);  
                                                  break;  
                                          case   ".tiff":    
                                                  bmp.Save(saveDialog.FileName,ImageFormat.Tiff);  
                                                  break;  
                                          default   :  
                                                  return   "";  
                                  }    
                                  return   saveDialog.FileName;  
                          }  
                          return   "";  
                  }  
          }  
  }  
 

posted on 2007-11-20 10:39  井泉  阅读(...)  评论(...编辑  收藏

导航