Снимок экрана с видимой подсказкой и курсором - PullRequest
0 голосов
/ 26 февраля 2009

Это код, который я использую для снимка экрана:

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

Это снимок экрана, но я хочу сделать снимок экрана с видимой подсказкой. Что мне нужно добавить, чтобы сделать снимок экрана с видимой подсказкой и курсором?

1 Ответ

3 голосов
/ 26 февраля 2009

В Vista есть специальный инструмент, который можно легко сделать, как указано в http://blog.falafel.com/2008/08/12/CaptureScreenShotsWithToolTipsAndPopupsUsingVistaSnippingTool.aspx.

Существует также приложение через Silverlight: http://blogs.msdn.com/swick/archive/2007/12/18/snipping-pictures-with-silverlight.aspx

Я не знаю, доступен ли исходный код для отсекающего инструмента. Вы можете попробовать снять видео, затем сделать снимок части видео , как показано здесь .

...