Come bloccare doppio clic nella funzione WndProc sovrascritta in Windows Form?

Ho un modulo creato in Windows Form che è trascinabile ovunque io clicchi. L’ho fatto sovrascrivendo la funzione WndProc che a sua volta modifica ogni clic come se fosse un clic sulla barra del titolo:

//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; } 

Il problema è che ora quando faccio doppio clic, la finestra diventa a schermo intero, che è indesiderata. Come posso bloccare questo comportamento?

Oltre a JaredPar, suggerirei di non creare una forma trascinabile in questo modo, ma gestirla in 3 passaggi

  • identificare il mouse sul modulo
  • cattura il mouse
  • identificare l’evento mouse up

Non è complicato da gestire, ed è meglio, imo, quindi disabilitare un doppio clic sul modulo.

Per un esempio completo di come puoi farlo puoi dare un’occhiata

Creazione di una forma senza bordi trascinabile

Stavo avendo lo stesso problema oggi in C ++. Ho usato la soluzione di JaredPar ma con WM_NCLBUTTONDBLCLK (0x00A3) invece di WM_LBUTTONDBLCLK, questo ha fatto il trucco per me! Funziona perché il messaggio di doppio clic viene inviato da un’area non client (NC), che in questo caso è la barra del titolo “virtuale” (HTCAPTION).

Ho fatto lo stesso di Jex che sta funzionando alla grande.

 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); } 

Sembra che tu abbia trovato una soluzione a un problema causando un altro problema che stai cercando di risolvere. Se potessi suggerire qualcosa di semplice, solo una soluzione migliore per rendere una finestra drag-able:

Aggiungi InteropServices alle dichiarazioni usando:

 using System.Runtime.InteropServices; 

E per il codice:

  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(); 

Quindi vai all’evento MouseDown del modulo e incolla questo:

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

Fatto.

Se si desidera interrompere il doppio clic dal comportamento predefinito nella finestra per la quale è stato sostituito il WndProc intercettare il messaggio 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; }