MouseMoveイベントを利用すればフォーム上をマウスが移動したときにそれを知ることができます。ところが他のアプリのウィンドウ上を移動した場合はそれを知ることはできません、

しかしマウスフックをすれば他のウィンドウでマウスが操作されたことを知ることができます。マウスがフォーム上から外れた場所で移動してもそれを知ることができるのです。

ではマウスフックをするクラスを作成してみることにしましょう。マウスが移動したりクリックされたときにイベントを発生させることができます。

SetWindowsHookEx関数を呼ぶときに第二引数をフィールド変数に保存しています。これをしないとガベージコレクタによって回収されてしまい動かなくなってしまいます。同じような記述を他のサイトで見たときは信じられませんでした。

ガベージコレクタはそんな間抜けなことはしないはずだ。

ところが実験してみると(実際にSetWindowsHookEx関数を実行したあとでSystem.GC.Collect()を呼んでみるとよい)、見事に詰みます。

これを使えばマウスが移動するとタイトルバーにマウスの座標を表示させることができます。

また他のウィンドウのタイトルを書き換えるプログラムもつくれます(実用性ゼロだけど)。