C#:如何从表单和控件中拖出一个?

我使用以下代码通过单击并拖动表单本身来拖动无边框表单。 它可以工作,但它不适用于单击并拖动窗体上的控件。 我需要能够在单击某些控件时拖动它而不是其他控件 – 按标签拖动,但不要通过按钮和文本框拖动。 我该怎么做?

protected override void WndProc(ref Message m) { base.WndProc(ref m); const int WM_NCHITTEST = 0x84; const int HTCLIENT = 0x1; const int HTCAPTION = 0x2; if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) m.Result = (IntPtr)HTCAPTION; } 

实际上,我在这里找到了解决方案。

 public const int WM_NCLBUTTONDOWN = 0xA1; public const int HTCAPTION = 0x2; [DllImport("User32.dll")] public static extern bool ReleaseCapture(); [DllImport("User32.dll")] public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); // Paste the below code in the your label control MouseDown event if (e.Button == MouseButtons.Left) { ReleaseCapture(); SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0); } 

有用。

此外,在我上面的代码中,如果需要resize,if语句应该更改为

  if (m.Msg == WM_NCHITTEST) if ((int)m.Result == HTCLIENT) m.Result = (IntPtr)HTCAPTION; 

使用Spy ++分析哪些控件正在接收哪些Windows消息,然后您将知道需要捕获的内容。

如果不深入研究你的代码,我想象主窗口上的子控件正在接收消息而不是表单,你想要特别回应其中的一些。