如何在Windows窗体中阻止双击重写的WndProc函数?

我有一个在Windows窗体中创建的表单,无论我在哪里点击都可以拖动。 我是通过重写WndProc函数来实现的,而WndProc函数又会修改每次点击,因为它是标题栏点击:

//found at: http://stackoverflow.com/questions/3995009/how-to-make-a-window-draggablec-winforms private const int WM_NCHITTEST = 0x84; private const int HTCLIENT = 0x1; private const int HTCAPTION = 0x2; /// /// Handling the window messages /// protected override void WndProc(ref Message message) { base.WndProc(ref message); if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT) message.Result = (IntPtr)HTCAPTION; } 

问题是,现在当我双击时,窗口变为全屏,这是不需要的。 我怎么能阻止这种行为?

除了JaredPar,我建议不要以这种方式创建可拖动的表单,而是分3步处理它

  • 在窗体上识别鼠标
  • 捕获鼠标
  • 识别鼠标事件

处理并不复杂,而且更好,imo,然后禁用双击表单。

有关如何执行此操作的完整示例,请查看

创建可拖动的无边框表单

我今天在C ++中遇到了同样的问题。 我使用了JaredPar的解决方案,但使用WM_NCLBUTTONDBLCLK(0x00A3)而不是WM_LBUTTONDBLCLK,这对我起了作用! 它正在工作,因为双击消息是从非客户端(NC)区域发送的,在这种情况下,这是“虚拟”标题栏(HTCAPTION)。

我做的和Jex一样,效果很好。

 private const int WM_NCHITTEST = 0x84; private const int HTCLIENT = 0x1; private const int HTCAPTION = 0x2; private const int WM_LBUTTONDBLCLK = 0x00A3; protected override void WndProc(ref Message m) { if (m.Msg == WM_LBUTTONDBLCLK) { return; } switch (m.Msg) { case WM_NCHITTEST: base.WndProc(ref m); if ((int)m.Result == HTCLIENT) m.Result = (IntPtr)HTCAPTION; return; } base.WndProc(ref m); } 

您似乎找到了问题的解决方案,导致您尝试解决的另一个问题。 如果我可以建议一些简单的东西,只需要一个更好的解决方案来使窗口可以拖动:

将InteropServices添加到using声明:

 using System.Runtime.InteropServices; 

对于代码:

  public const int WM_NCLBUTTONDOWN = 0xA1; public const int HT_CAPTION = 0x2; [DllImportAttribute("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); [DllImportAttribute("user32.dll")] public static extern bool ReleaseCapture(); 

然后转到表单的MouseDown事件并粘贴它:

  if (e.Button == MouseButtons.Left) { ReleaseCapture(); SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); } 

完成。

如果你只是想在你已覆盖WndProc的窗口中停止双击它的默认行为,那么拦截WM_LBUTTONDBLCLK消息

 private const int WM_LBUTTONDBLCLK = 0x0203; ... protected override void WndProc(ref Message message) { if (message.Msg == WM_LBUTTONDBLCLK) { return; } base.WndProc(ref message); if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT) message.Result = (IntPtr)HTCAPTION; }