は?何言ってんの?と思うかもしれませんが、真面目な話です。作成したアプリの動作を画面録画してYouTubeにアップしていますが、これはAG-デスクトップレコーダーというフリーのソフトを使っています。

AG-デスクトップレコーダー – k本的に無料ソフト・フリーソフト

ところがこれだと録画中に録画する場所を変更することができません。そこで自作することにしました。その結果、できあがったのが以下の動画です。

画面録画するにはどうすればいいのか

画面録画するにはどうすればいいのでしょうか? ここを参考にしました。

【c#】画面を録画する方法 WORK NOTE

AForge.NETというライブラリを使用します。そしてリンク先の記事を参考に以下のようなコードを書いてみました。

これで座標(0,0)を起点に640 × 480ピクセルで画面録画することができます。座標を変えれば動作中に録画する場所を変更することができそうです。録画する場所を簡単に変更するのであればフォームに穴をあけてそこから見える部分を録画するという仕様にしたいのですがどうでしょうか?

フォームに穴をあける

ではフォームに穴をあけるにはどうすればいいのでしょうか?

Form.TransparencyKeyプロパティを使えば簡単にできます。Form.TransparencyKeyプロパティにセットした色が透明になるのです。

以下のコードでは赤い矩形を描画することでその部分を透明にしています。

フォームの穴から画面録画

フォームに穴をあけることができたら、この部分を画面録画できるようにします。

フォームを自前で移動させる

これで完成といいたいのですが、実際に使ってみると問題点があることがわかりました。ウィンドウをドラッグして移動するとき、ドロップで移動先が確定するまで移動先が描画されます。この部分が録画されてしまうのです。

動画の29秒あたりから画面録画をした動画を再生しているのですが、フォームを移動させようとすると枠のようなものが写り込んでいることがわかります。

そこでウィンドウをドラッグしたら移動がすぐにおこなわれるようにして線が入るのを防ぎます。フォームを移動させるときはタイトルバーをドラッグするのではなくクライアント領域をドラッグするようにします。

マウスボタンが押されたらForm.Locationをフィールド変数に保存します。そしてどれだけ移動するかはイベントハンドラの引数を利用すれば算出できるのですが、このときe.Xとかe.Yで取得できる座標はクライアント座標です。フォームが移動すれば同じ座標でもクライアント座標はかわります。そこでスクリーン座標として保存し評価しなければなりません。

これでクライアント領域をドラッグすればフォームを移動させることができるのですが、タイトルバーをドラッグしたときも同様に移動できるようにしてしまいましょう。

クライアント領域以外の部分がクリックされたらWM_NCLBUTTONDOWNメッセージが発生します。またWParamがHTCAPTIONのときがタイトルバーがクリックされたときです。そこでそのときは以下の処理をおこないます。これでフォームを移動させることができます。