2011-07-19 58 views
12

我使用下面的代碼來捕獲位圖中的屏幕。屏幕被捕獲,但我無法獲得屏幕上的鼠標指針。你能否提出一些替代方法,以便捕獲鼠標?如何使用Windows API捕獲屏幕和鼠標指針?

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

回答

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

尼斯,乾淨,快速的代碼。謝謝。 –

+2

請注意,此代碼會在錯誤的位置繪製一些光標,因爲您需要爲偏移調用「GetIconInfo」。另外一些會出現褪色,更多詳細信息請參閱:http://stackoverflow.com/questions/918990/ – WhoIsRich