Вы можете попробовать это в вашей форме:
public partial class TestForm : Form {
private const int HT_CAPTION = 0x2;
private const int WM_NCLBUTTONDOWN = 0xA1;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
public TestForm() {
InitializeComponent();
this.ControlBox = false;
}
protected override void WndProc(ref Message m) {
if (m.Msg == Win32.WM_NCLBUTTONDOWN) {
Form moveForm = new Form();
moveForm.FormBorderStyle = FormBorderStyle.None;
moveForm.StartPosition = FormStartPosition.Manual;
moveForm.ShowInTaskbar = false;
moveForm.TransparencyKey = Color.Lime;
moveForm.BackColor = Color.Lime;
moveForm.SetBounds(this.Left, this.Top, this.Width, this.Height);
moveForm.Paint += moveForm_Paint;
moveForm.Show();
SendMessage(moveForm.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
moveForm.Paint -= moveForm_Paint;
moveForm.Close();
} else {
base.WndProc(ref m);
}
}
void moveForm_Paint(object sender, PaintEventArgs e) {
using (Pen p = new Pen(Color.Gray, 7)) {
p.Alignment = System.Drawing.Drawing2D.PenAlignment.Center;
e.Graphics.DrawRectangle(p, ((Form)sender).ClientRectangle);
}
}
}
Он перехватывает левую кнопку mousedown вне клиентской области, открывает прозрачную форму, которая рисует серый прямоугольник вокруг границ, и отправляет сообщение для перемещения формы, как если бы это была форма, на которую вы нажали.