2011-07-19 11 views
12

Ekranı bir bitmapte yakalamak için aşağıdaki kodu kullanıyorum. Ekran çekildi, ancak ekranda fare imlecini alamıyorum. Farenin de yakalanması için alternatif bir yaklaşım önerebilir misiniz?Windows API'lerini kullanarak ekran ve fare işaretçisi nasıl yakalanır?

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

cevap

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

Güzel, temiz ve hızlı kodu. Teşekkürler. –

+2

Not: Bu kod, ofsetler için 'GetIconInfo' çağırmanız gerektiğinden, bazı kodları yanlış konuma çekecektir. Ayrıca bazıları soluk görünür, daha fazla bilgi için bkz: http://stackoverflow.com/questions/918990/ – WhoIsRich

İlgili konular