2011-11-24 6 views
-1
using System; 
using System.Runtime.InteropServices; 
using System.Drawing; 
using System.Drawing.Imaging; 

namespace ScreenShotDemo 
{ 

    /// <summary> 
    /// Provides functions to capture the entire screen, or a particular window, and save it to a file. 
    /// </summary> 
    public class ScreenCapture 
    { 

     static void Main() 
     { 

     ScreenCapture sc = new ScreenCapture(); 
     // capture entire screen, and save it to a file 
     Image img = sc.CaptureScreen(); 
     // display image in a Picture control named imageDisplay 
     //this.imageDisplay.Image = img; 
     img.Save("c:\\myBitmap.bmp"); 
     // capture this window, and save it 
     sc.CaptureWindowToFile(Handle,"C:\\temp2.gif",ImageFormat.Gif); 
     // ScreenCapture run = new ScreenCapture(); 
     // run.CaptureScreen(); 
     } 

     /// <summary> 
     /// Creates an Image object containing a screen shot of the entire desktop 
     /// </summary> 
     /// <returns></returns> 
     public Image CaptureScreen() 
     { 
      return CaptureWindow(User32.GetDesktopWindow()); 
     } 

     /// <summary> 
     /// Creates an Image object containing a screen shot of a specific window 
     /// </summary> 
     /// <param name="handle">The handle to the window. (In windows forms, this is obtained by the Handle property)</param> 
     /// <returns></returns> 
     public Image CaptureWindow(IntPtr handle) 
     { 
      // get te hDC of the target window 
      IntPtr hdcSrc = User32.GetWindowDC(handle); 
      // get the size 
      User32.RECT windowRect = new User32.RECT(); 
      User32.GetWindowRect(handle,ref windowRect); 
      int width = windowRect.right - windowRect.left; 
      int height = windowRect.bottom - windowRect.top; 
      // create a device context we can copy to 
      IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc); 
      // create a bitmap we can copy it to, 
      // using GetDeviceCaps to get the width/height 
      IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc,width,height); 
      // select the bitmap object 
      IntPtr hOld = GDI32.SelectObject(hdcDest,hBitmap); 
      // bitblt over 
      GDI32.BitBlt(hdcDest,0,0,width,height,hdcSrc,0,0,GDI32.SRCCOPY); 
      // restore selection 
      GDI32.SelectObject(hdcDest,hOld); 
      // clean up 
      GDI32.DeleteDC(hdcDest); 
      User32.ReleaseDC(handle,hdcSrc); 

      // get a .NET image object for it 
      Image img = Image.FromHbitmap(hBitmap); 
      // free up the Bitmap object 
      GDI32.DeleteObject(hBitmap); 

      return img; 
     } 

     /// <summary> 
     /// Captures a screen shot of a specific window, and saves it to a file 
     /// </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> 
     /// Captures a screen shot of the entire desktop, and saves it to a file 
     /// </summary> 
     /// <param name="filename"></param> 
     /// <param name="format"></param> 
     public void CaptureScreenToFile(string filename, ImageFormat format) 
     { 
      Image img = CaptureScreen(); 
      img.Save(filename,format); 
     } 

     /// <summary> 
     /// Helper class containing Gdi32 API functions 
     /// </summary> 
     private class GDI32 
     { 

      public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter 

      [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> 
     /// Helper class containing User32 API functions 
     /// </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); 

     } 


    } 
} 

"이름 핸들이 현재 컨텍스트에 존재하지 않습니다.", 제발 도와주세요.# Full ScreenShot 캡쳐 코드

감사 Nishant

+1

sc.CaptureWindowToFile으로 static void Main() 본문을 교체; Handle 변수는이 명령문이 액세스 할 수있는 곳에서는 선언되지 않습니다. –

+1

2 개의 댓글, 무엇입니까, 어디서 오류가 발생합니까? 그리고 아마 당신은 짧은 것이 아니라 스크린 샷을 의미 할 것입니다. – Jodrell

+0

누구나 WPF 응용 프로그램에서이 문제를 사용하는 데 문제가 있습니까? –

답변

1

("C : \\ temp2.gif"핸들 ImageFormat.Gif)를

CaptureScreenToFile("C:\\temp2.gif",ImageFormat.Gif)