クライアント領域をドラッグしてフォームを移動する


マウスイベントが発生するとWM_NCHITTESTメッセージがWindowsからフォームに投げられる。
このメッセージに対してフォームは、クリックされた場所がタイトルバーであればHTCAPTION、クライアント領域であればHTCLIENTを返す。
WndProcをオーバーライドすると、クライアント領域をクリックしたときにWM_NCHITTESTメッセージを補足することができる。
そこで、WndProcをオーバーライドし、WM_NCHITTESTを補足した際にHTCAPTIONを返すことで、クライアント領域をクリックしてフォームを移動することができる。

また、このままではクライアント領域をダブルクリックしたときにフォームが最大化してしまう。
これを防ぐには、ダブルクリックのイベントを拾い、その時何もせずにreturnすればよい。


private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;

protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
// クライアント領域をクリックされた場合、HTCAPTIONを返す
case WM_NCHITTEST:
base.WndProc(ref m);
if ((int)m.Result == HTCLIENT)
{
m.Result = (IntPtr)HTCAPTION;
}
return;

// フォームがダブルクリックされた場合最大化しない
case WM_NCLBUTTONDBLCLK:
return;

}
base.WndProc(ref m);
}