A slightly different solution.
using System.Runtime.InteropServices;
private const int WM_NCLBUTTONDOWN = 0xA1;
private const int HTCAPTION = 0x2;
[DllImport("User32.dll")]
private static extern bool ReleaseCapture();
[DllImport("User32.dll")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
public Form()
{
InitializeComponent();
AssignHandler(this);
}
private void AssignHandler(Control control)
{
if (control is Form
|| control is Label
|| control is Panel
|| control is PictureBox
|| control is TableLayoutPanel)
{
control.MouseDown += Form_MouseDown;
}
foreach (Control subControl in control.Controls)
{
AssignHandler(subControl);
}
}
private void Form_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
}