C#でマウスカーソルを含んだスクリーンキャプチャをとる

chakemiです。 本日は、マウスカーソルを含んだスクリーンキャプチャを取得してみます。

先日書きました方法では、デスクトップの壁紙やアイコン、ウィンドウしかキャプチャ出来ません。 カーソルを含んだ画像にするには、カーソルの位置、状態を取得してキャプチャ画像上に描画するのが定石のようです。

では、前回のソースをもとにカーソルを描画してみます。

開発環境

  • WindowsXP SP3
  • VisualC# 2010Express

まず、現在のカーソルのハンドルを取得します。

1
this.Cursor = new Cursor(Cursor.Current.Handle);

次に、カーソルの位置を取得します。

1
Point curPoint = Cursor.Position;

最後に、Graphicsオブジェクトに描画します。

1
this.Cursor.Draw(graph, new Rectangle(curPoint, this.Cursor.Size));

全体のソース

1
2
3
4
5
6
7
8
9
10
this.Cursor = new Cursor(Cursor.Current.Handle);
Point curPoint = Cursor.Position;

Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graph = Graphics.FromImage(bmp);
graph.CopyFromScreen(new Point(0, 0), new Point(0, 0), bmp.Size);
this.Cursor.Draw(graph, new Rectangle(curPoint, this.Cursor.Size));
graph.Dispose();

pictureBox1.Image = bmp;

しかし、これだけだとキャプチャしたカーソルと実際のカーソルの位置がずれてしまいます。

これには、カーソルのホットスポットを取得して描画位置を調整する必要があります。 ホットスポットの説明については、この辺におまかせします。

では、ホットスポットを調整してみます。 カーソルのホットスポットを取得します。

1
Point hotSpot = this.Cursor.HotSpot;

カーソルの描画位置がホットスポットになるように、ホットスポットの値だけ引きます。

1
2
3
Point position = new Point((curPoint.X - hotSpot.X),(curPoint.Y - hotSpot.Y));

this.Cursor.Draw(graph, new Rectangle(position, this.Cursor.Size));

Timerクラスを使って一定間隔でImageBoxに描画してみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void timer1_Tick(object sender, EventArgs e)
{
    this.Cursor = new Cursor(Cursor.Current.Handle);
    Point curPoint = Cursor.Position;
    Point hotSpot = this.Cursor.HotSpot;
    Point position = new Point((curPoint.X - hotSpot.X),(curPoint.Y - hotSpot.Y));

    Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    Graphics graph = Graphics.FromImage(bmp);
    graph.CopyFromScreen(new Point(0, 0), new Point(0, 0), bmp.Size);
    this.Cursor.Draw(graph, new Rectangle(position, this.Cursor.Size));
    graph.Dispose();

    pictureBox1.Image = bmp;
}

これで、カーソルを含んでキャプチャできました♪

Comments