2011-07-19 13 views
12

Estoy usando el siguiente código para capturar la pantalla en un mapa de bits. La pantalla se captura, pero no puedo obtener el puntero del mouse en la pantalla. ¿Podría sugerir algún enfoque alternativo para que también se capture el mouse?Cómo capturar la pantalla y el puntero del mouse con las API de Windows?

private Bitmap CaptureScreen() 
    { 
     // Size size is how big an area to capture 
     // pointOrigin is the upper left corner of the area to capture 
     int width = Screen.PrimaryScreen.Bounds.X + Screen.PrimaryScreen.Bounds.Width; 
     int height = Screen.PrimaryScreen.Bounds.Y + Screen.PrimaryScreen.Bounds.Height; 
     Size size = new Size(width, height); 
     Point pointOfOrigin = new Point(0, 0); 

     Bitmap bitmap = new Bitmap(size.Width, size.Height); 
     { 
      using (Graphics graphics = Graphics.FromImage(bitmap)) 
      { 
       graphics.CopyFromScreen(pointOfOrigin, new Point(0, 0), size); 
      } 
      return bitmap; 
     } 
    } 

Respuesta

21
[StructLayout(LayoutKind.Sequential)] 
struct CURSORINFO 
{ 
    public Int32 cbSize; 
    public Int32 flags; 
    public IntPtr hCursor; 
    public POINTAPI ptScreenPos; 
} 

[StructLayout(LayoutKind.Sequential)] 
struct POINTAPI 
{ 
    public int x; 
    public int y; 
} 

[DllImport("user32.dll")] 
static extern bool GetCursorInfo(out CURSORINFO pci); 

[DllImport("user32.dll")] 
static extern bool DrawIcon(IntPtr hDC, int X, int Y, IntPtr hIcon); 

const Int32 CURSOR_SHOWING = 0x00000001; 

public static Bitmap CaptureScreen(bool CaptureMouse) 
{ 
    Bitmap result = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format24bppRgb); 

    try 
    { 
     using (Graphics g = Graphics.FromImage(result)) 
     { 
      g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); 

      if (CaptureMouse) 
      { 
       CURSORINFO pci; 
       pci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(CURSORINFO)); 

       if (GetCursorInfo(out pci)) 
       { 
        if (pci.flags == CURSOR_SHOWING) 
        { 
         DrawIcon(g.GetHdc(), pci.ptScreenPos.x, pci.ptScreenPos.y, pci.hCursor); 
         g.ReleaseHdc(); 
        } 
       } 
      } 
     } 
    } 
    catch 
    { 
     result = null; 
    } 

    return result; 
} 
+0

agradable, limpio y rápido código. Gracias. –

+2

Tenga en cuenta que este código dibujará algunos cursores en la posición incorrecta, ya que debe llamar a 'GetIconInfo' para los desplazamientos. También algunos aparecerán desvanecidos, para más detalles ver: http://stackoverflow.com/questions/918990/ – WhoIsRich

Cuestiones relacionadas