2009-02-26 17 views
-5

Dieser Punkt ist der Code, den ich einen Screenshot nehmen bin mit:einen Screenshot mit Tooltip und Cursor sichtbar

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

Es macht einen Screenshot erfassen, aber ich möchte mit dem Tooltip sichtbar den Screenshot nehmen. Was muss ich hinzufügen, um den Screenshot mit dem Tooltip und dem Cursor sichtbar zu machen?

+0

Duplikat von http://stackoverflow.com/questions/584963/tool-tipscreen-shot und http://stackoverflow.com/questions/589151/taking-screenshots – Jared

+1

Scheint wie die gleiche Person fragen mit zwei verschiedenen Konten! – Cerebrus

+1

Erstaunlich ... zwei Personen denken über das gleiche Problem mit dem gleichen Code an den gleichen Code ... was für ein Zufall .. -1 für die gleiche Frage zweimal und das auch mit anderen Benutzerkonten .. – Naveen

Antwort

3

Vista hat ein schneidendes Tool, um es einfach zu tun, wie in http://blog.falafel.com/2008/08/12/CaptureScreenShotsWithToolTipsAndPopupsUsingVistaSnippingTool.aspx angegeben.

Es gibt auch eine Anwendung über Silverlight: http://blogs.msdn.com/swick/archive/2007/12/18/snipping-pictures-with-silverlight.aspx

Ich weiß nicht, ob Quellcode für das Snipping Tool zur Verfügung steht. Sie können versuchen, ein Video aufzunehmen und dann einen Schnappschuss eines Teils des Videos zu machen. as shown here.

+0

Ich benutze das 'WinSnap'-Dienstprogramm, das im Allgemeinen gut funktioniert, insbesondere behandelt es abgerundete Fensterecken und kann einen bestimmten Satz von Fenstern einrasten. Aber WinSnap ist ** nicht kostenlos **. Es gibt [eine kostenlose ältere Version] (http://www.ntwind.com/software/winsnap/download-free-version.html), aber ich weiß nicht, wie gut es auf modernen Windows funktioniert. –