Jump to content
Xtreme .Net Talk

Recommended Posts

Posted (edited)

Hi i use this class to take a screen capture but i want to include small yellow tooltips in my screen shot how do i do that?, if you press print screen then you get em in the picture so there should be a way?

 

   public class ScreenCapture
   {
       /// <summary>
       /// Creates an Image object containing a screen shot of the entire desktop
       /// </summary>
       /// <returns></returns>
       public Image CaptureScreen()
       {
           return CaptureWindow(User32.GetDesktopWindow());
       }

       /// <summary>
       /// Creates an Image object containing a screen shot of a specific window
       /// </summary>
       /// <param name="handle">The handle to the window. (In windows forms, this is obtained by the Handle property)</param>
       /// <returns></returns>
       private Image CaptureWindow(IntPtr handle)
       {
           // get te hDC of the target window
           IntPtr hdcSrc = User32.GetWindowDC(handle);
           // get the size
           User32.RECT windowRect = new User32.RECT();
           User32.GetWindowRect(handle, ref windowRect);
           int width = windowRect.right - windowRect.left;
           int height = windowRect.bottom - windowRect.top;
           // create a device context we can copy to
           IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
           // create a bitmap we can copy it to,
           // using GetDeviceCaps to get the width/height
           IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
           // select the bitmap object
           IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
           // bitblt over
           GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
           // restore selection
           GDI32.SelectObject(hdcDest, hOld);
           // clean up 
           GDI32.DeleteDC(hdcDest);
           User32.ReleaseDC(handle, hdcSrc);
           // get a .NET image object for it
           Image img = Image.FromHbitmap(hBitmap);
           // free up the Bitmap object
           GDI32.DeleteObject(hBitmap);
           return img;
       }

       /// <summary>
       /// Helper class containing Gdi32 API functions
       /// </summary>
       private class GDI32
       {

           public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter
           [DllImport("gdi32.dll")]
           public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
               int nWidth, int nHeight, IntPtr hObjectSource,
               int nXSrc, int nYSrc, int dwRop);
           [DllImport("gdi32.dll")]
           public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,
               int nHeight);
           [DllImport("gdi32.dll")]
           public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
           [DllImport("gdi32.dll")]
           public static extern bool DeleteDC(IntPtr hDC);
           [DllImport("gdi32.dll")]
           public static extern bool DeleteObject(IntPtr hObject);
           [DllImport("gdi32.dll")]
           public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
       }

       /// <summary>
       /// Helper class containing User32 API functions
       /// </summary>
       private class User32
       {
           [structLayout(LayoutKind.Sequential)]
           public struct RECT
           {
               public int left;
               public int top;
               public int right;
               public int bottom;
           }
           [DllImport("user32.dll")]
           public static extern IntPtr GetDesktopWindow();
           [DllImport("user32.dll")]
           public static extern IntPtr GetWindowDC(IntPtr hWnd);
           [DllImport("user32.dll")]
           public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
           [DllImport("user32.dll")]
           public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
       }
   }

Edited by Wing
  • *Experts*
Posted

Hmm... I'm guessing the problem from all the methods that don't work, is that they're operating off the window handle and having the window draw itself into the offscreen surface. Maybe the trick is to use the screen's handle itself so that it can pick up all the windows, including the tooltip. I'm sorry I've got no code or link to help, but thought the info might spark something else to try if you've run dry.

 

-ners

"I want to stand as close to the edge as I can without going over. Out on the edge you see all the kinds of things you can't see from the center." - Kurt Vonnegut
Posted

Iv found a way to fix the problem :P

iv changed

GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);

to:

GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY | GDI32.CAPTUREBLT);

and added public const int CAPTUREBLT = 1073741824; to the GDI32 class

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...