-5

这是我用来截屏的代码:

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

[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 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 = GetDC(GetDesktopWindow());

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

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

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

    //We create a compatible bitmap of the screen size and using
    //the screen device context.
    hBitmap = 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)SelectObject
            (hMemDC, hBitmap);
        //We copy the Bitmap to the memory device context.
        BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC,0, 0,SRCCOPY);
        //We select the old bitmap back to the memory device context.
        SelectObject(hMemDC, hOld);
        //We delete the memory device context.
        DeleteDC(hMemDC);
        //We release the screen device context.
        ReleaseDC(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.
        DeleteObject(hBitmap);
        //This statement runs the garbage collector manually.
        GC.Collect();
        //Return the bitmap 
        return bmp;
    }
    //If hBitmap is null, retun null.
    return null;
}

它确实捕获了屏幕截图,但我想截取带有可见工具提示的屏幕截图。我必须添加什么才能在工具提示和光标可见的情况下截屏?

4

1 回答 1

3

如http://blog.falafel.com/2008/08/12/CaptureScreenShotsWithToolTipsAndPopupsUsingVistaSnippingTool.aspx中给出的,Vista 有一个截图工具可以轻松做到这一点。

还有一个通过 Silverlight 的应用程序:http: //blogs.msdn.com/swick/archive/2007/12/18/snipping-pictures-with-silverlight.aspx

我不知道截图工具是否有源代码。您可以尝试拍摄视频,然后对视频的一部分进行快照,如此处所示

于 2009-02-26T05:52:20.893 回答