2013-03-03 3 views

ответ

0

Проект White.Repository фактически записывает поток вашего теста со скриншотами, но он не очень хорошо документирован и еще не выпущен на NuGet (он скоро будет).

Лично я использую этот класс, который мы собрали из множества источников и забываем, откуда я его получил. Это фиксирует модальные диалоги и другие вещи, которые многие из других реализаций не захватили по какой-то причине.

/// <summary> 
/// Provides functions to capture the entire screen, or a particular window, and save it to a file. 
/// </summary> 
public class ScreenCapture 
{ 
    [DllImport("gdi32.dll")] 
    static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop); 
    [DllImport("user32.dll")] 
    static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc); 
    [DllImport("gdi32.dll")] 
    static extern IntPtr DeleteDC(IntPtr hDc); 
    [DllImport("gdi32.dll")] 
    static extern IntPtr DeleteObject(IntPtr hDc); 
    [DllImport("gdi32.dll")] 
    static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); 
    [DllImport("gdi32.dll")] 
    static extern IntPtr CreateCompatibleDC(IntPtr hdc); 
    [DllImport("gdi32.dll")] 
    static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetDesktopWindow(); 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetWindowDC(IntPtr ptr); 

    public Bitmap CaptureScreenShot() 
    { 
     var sz = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size; 
     var hDesk = GetDesktopWindow(); 
     var hSrce = GetWindowDC(hDesk); 
     var hDest = CreateCompatibleDC(hSrce); 
     var hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height); 
     var hOldBmp = SelectObject(hDest, hBmp); 
     BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); 
     var bmp = Image.FromHbitmap(hBmp); 
     SelectObject(hDest, hOldBmp); 
     DeleteObject(hBmp); 
     DeleteDC(hDest); 
     ReleaseDC(hDesk, hSrce); 

     return bmp; 
    } 
} 

Затем потреблять

var sc = new ScreenCapture(); 
var bitmap = sc.CaptureScreenShot(); 
bitmap.Save(fileName + ".png"), ImageFormat.Png); 
1

От глядя через код на GitHub, это не кажется, есть API для этого (возможно add it as a feature request?).

Вы можете сделать это довольно просто самостоятельно, используя комбинацию классов Screen и Graphics.CopyFromScreen. Есть несколько примеров того, как захватить экран или активное окно в ответах на this question.

3

Я знаю, что это очень старый пост. Но я, однако, не могу обидеть его. TestStack.White выполняет следующие функции:

//Takes a screenshot of the entire desktop, and saves it to disk 
Desktop.TakeScreenshot("C:\\white-framework.png", System.Drawing.Imaging.ImageFormat.Png); 
//Captures a screenshot of the entire desktop, and returns the bitmap 
Bitmap bitmap = Desktop.CaptureScreenshot(); 
Смежные вопросы