2010-06-16 13 views
8

Perdón por el título raro, actualmente estoy jugando con WinForms y me pregunto si hay alguna manera de hacerlo para que se ponga ¿Tiene que 'hacer doble clic' en la ventana para activar un elemento en un menú secundario cuando la ventana está desenfocada?Desactivar el 'requisito' para hacer doble clic en una ventana desenfocada al hacer clic en un menustrip

Actualmente, si la ventana está desenfocada, primero tengo que hacer clic en la ventana para darle enfoque y luego hacer clic una vez más en el elemento menustrip incluso si mi mouse se movía sobre el elemento menustrip desde el principio.

¡Gracias de antemano!

Respuesta

8

trate de poner esta función en su clase Form:

protected override void WndProc(ref Message m) { 
    int WM_PARENTNOTIFY = 0x0210; 
    if (!this.Focused && m.Msg == WM_PARENTNOTIFY) { 
     // Make this form auto-grab the focus when menu/controls are clicked 
     this.Activate(); 
    } 
    base.WndProc(ref m); 
} 
+0

Funcionó simplemente perfecto, muchas gracias! – Gustav

0

El método de la respuesta de @ Detmar se centrará la ventana cuando se destruye la ventana (ver https://msdn.microsoft.com/en-us/library/windows/desktop/hh454920(v=vs.85).aspx). Eso puede causar problemas si tiene varias ventanas en su aplicación y está saliendo. Aquí hay uno que no se disparará cuando esté desechando ventanas:

protected override void WndProc(ref Message m) 
    { 
     const int WM_PARENTNOTIFY = 0x0210; 
     if (!this.Focused && m.Msg == WM_PARENTNOTIFY) 
     { 
      const int WM_CREATE = 0x0001; 
      const int WM_DESTROY = 0x0002; 
      const int WM_LBUTTONDOWN = 0x0201; 
      const int WM_MBUTTONDOWN = 0x0207; 
      const int WM_RBUTTONDOWN = 0x0204; 
      const int WM_XBUTTONDOWN = 0x020B; 
      const int WM_POINTERDOWN = 0x0246; 

      int type = (int)(0xFFFF & (long)m.WParam); 
      switch (type) 
      { 
       case WM_LBUTTONDOWN: 
       case WM_MBUTTONDOWN: 
       case WM_RBUTTONDOWN: 
       case WM_XBUTTONDOWN: 
       case WM_POINTERDOWN: 
        // Make this form auto-grab the focus when menu/controls are clicked 
        this.Activate(); 
        break; 
       case WM_DESTROY: 
       case WM_CREATE: 
        //do nothing 
        break; 
      } 
     } 
     base.WndProc(ref m); 
    } 
Cuestiones relacionadas