2011-07-19 90 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

関連する問題