Попробуйте это
using System.Runtime.InteropServices;
const int HT_CAPTION = 0x2;
const int WM_NCLBUTTONDOWN = 0xA1;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd,int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Обновление
Функция ReleaseCapture () освобождает захват мыши из окна в текущем потоке и восстанавливает обычную обработку ввода мышью. Окно, которое захватило мышь, получает все данные, введенные мышью, независимо от положения курсора, кроме случаев, когда кнопка мыши нажата, когда горячая точка курсора находится в окне другого потока.
Сообщение WM_NCLBUTTONDOWN отправляется окну, если щелкнуть левой кнопкой мыши в не клиентской области окна. WParam указывает значение перечисления для проверки попадания. Мы передаем HTCAPTION, а lParam указывает позицию курсора, которую мы передаем как 0, чтобы он обязательно находился в строке заголовка.