15

.Net コードを使用して任意の URL のスクリーン ショットを撮ることは可能ですか?

それを行う最も簡単な方法は何ですか?

4

4 に答える 4

5

これにつまずいた: http://pietschsoft.com/post/2008/07/C-Generate-WebPage-Thumbmail-Screenshot-Image.aspx

たぶん、あなたが使用できるものはありますか?

于 2009-03-17T13:54:06.563 に答える
4

これには、自分で行うのではなく、サードパーティのアプローチを使用することをお勧めします。ただし、強く主張する場合は、 を使用System.Diagnostics.Processしてブラウザを起動しGetDesktopImage、スクリーンショットを取得するという手荒な方法があります。

もっと簡単な方法があると思いますが、次のようになります。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

public class PlatformInvokeGDI32
{
    public  const int SRCCOPY = 13369376;

    [DllImport("gdi32.dll",EntryPoint="DeleteDC")]
    public static extern IntPtr DeleteDC(IntPtr hDc);

    [DllImport("gdi32.dll",EntryPoint="DeleteObject")]
    public static extern IntPtr DeleteObject(IntPtr hDc);

    [DllImport("gdi32.dll",EntryPoint="BitBlt")]
    public static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, int RasterOp);

    [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleBitmap")]
    public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc,int nWidth, int nHeight);

    [DllImport ("gdi32.dll",EntryPoint="CreateCompatibleDC")]
    public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

    [DllImport ("gdi32.dll",EntryPoint="SelectObject")]
    public static extern IntPtr SelectObject(IntPtr hdc,IntPtr bmp);
}

public class PlatformInvokeUSER32
{
    public const int SM_CXSCREEN = 0;
    public const int SM_CYSCREEN = 1;

    [DllImport("user32.dll", EntryPoint="GetDesktopWindow")]
    public static extern IntPtr GetDesktopWindow();

    [DllImport("user32.dll",EntryPoint="GetDC")]
    public static extern IntPtr GetDC(IntPtr ptr);

    [DllImport("user32.dll",EntryPoint="GetSystemMetrics")]
    public static extern int GetSystemMetrics(int abc);

    [DllImport("user32.dll",EntryPoint="GetWindowDC")]
    public static extern IntPtr GetWindowDC(Int32 ptr);

    [DllImport("user32.dll",EntryPoint="ReleaseDC")]
    public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDc);
}

public class CaptureScreen
{
    public static Bitmap GetDesktopImage()
    {
        //In size variable we shall keep the size of the screen.
        SIZE size;

        //Variable to keep the handle to bitmap.
        IntPtr hBitmap;

        //Here we get the handle to the desktop device context.
        IntPtr  hDC = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow());

        //Here we make a compatible device context in memory for screen device context.
        IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);

        //We pass SM_CXSCREEN constant to GetSystemMetrics to get the
        //X coordinates of the screen.
        size.cx = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CXSCREEN);

        //We pass SM_CYSCREEN constant to GetSystemMetrics to get the Y coordinates of the screen.
        size.cy = PlatformInvokeUSER32.GetSystemMetrics (PlatformInvokeUSER32.SM_CYSCREEN);

        //We create a compatible bitmap of the screen size and using the screen device context.
        hBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);

        //As hBitmap is IntPtr, we cannot check it against null.
        //For this purpose, IntPtr.Zero is used.
        if(hBitmap != IntPtr.Zero)
        {
            //Here we select the compatible bitmap in the memeory device
            //context and keep the refrence to the old bitmap.
            IntPtr hOld = (IntPtr) PlatformInvokeGDI32.SelectObject(hMemDC, hBitmap);

            //We copy the Bitmap to the memory device context.
            PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);

            //We select the old bitmap back to the memory device context.
            PlatformInvokeGDI32.SelectObject(hMemDC, hOld);

            //We delete the memory device context.
            PlatformInvokeGDI32.DeleteDC(hMemDC);

            //We release the screen device context.
            PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC);

            //Image is created by Image bitmap handle and stored in local variable.
            Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);

            //Release the memory to avoid memory leaks.
            PlatformInvokeGDI32.DeleteObject(hBitmap);

            //This statement runs the garbage collector manually.
            GC.Collect();

            //Return the bitmap
            return bmp;
        }

        //If hBitmap is null, retun null.
        return null;
    }
}

//This structure shall be used to keep the size of the screen.
public struct SIZE
{
  public int cx;
  public int cy;
}
于 2009-03-17T11:37:17.597 に答える
2

これを行うサードパーティのコンポーネントがいくつかあります。たとえば、Flash などはそれほど簡単にキャプチャできないため、どうやらそれは些細なことではありません。

私は過去にHTMLSnapshotを使用したことがあり、満足していました (無料ではありませんが、かなり安価です)。

これらのサードパーティのソリューションが既に処理している多くの最終的なケースをやり直すことになるため、これを自分で実装するのにあまり時間を無駄にしないことを心からお勧めします.

于 2009-03-17T11:45:07.297 に答える