Лучше всего использовать pinvoke.Свяжите событие «mousedown», к которому всегда нужно перетаскивать элемент управления.
using System.Runtime.InteropServices;
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
private static extern int SendMessage(IntPtr hWnd,
int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
private static extern bool ReleaseCapture();
public Form1()
{
InitializeComponent();
}
private void menuStrip1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Это все еще требует фокусировки формы, но вы можете обойти ее, используя наведение мыши.Это не так уж и элегантно, но работает.
private void menuStrip1_MouseHover(object sender, EventArgs e)
{
Focus();
}
Обновление : при наведении мыши происходит небольшая задержка, движение мыши гораздо более отзывчиво
private void menuStrip1_MouseMove(object sender, MouseEventArgs e)
{
if (!Focused)
{
Focus();
}
}