2010-01-06 7 views
6

He intentado varias cosas, pero ninguno de ellos funciona ...no se puede llevar a consistentemente forma frontal

tengo formulario que debe venir en frente de todas las ventanas de NotifyIcon clic. Así que aquí es lo que he intentado:

private void notifyIcon1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     this.TopMost = true; 
     this.BringToFront(); 
     this.Focus(); 
     this.TopMost = false; 
    } 
} 

Luego trató de utilizar SetForegroundWindow:

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
public static extern bool SetForegroundWindow(IntPtr hwnd); 

añadiendo

 SetForegroundWindow(this.Handle); 

al final del bloque if.

Finalmente, vi que cuando esto no funciona, si hago clic con el botón derecho del mouse en NotifyIcon y se abre el menú contextual, puedo hacer clic izquierdo en NotifyIcon y ponerlo al frente.

He intentado añadir este código al principio:

 cmsNotifyIcon.Show(); 
     cmsNotifyIcon.Close(); 

para que muestre y se cierra NotifyIcon menú de contexto, como una posible solución para la idea, pero no ayuda.

¿Alguna idea sobre cómo hacer esto, o solucionar este problema?

Respuesta

5

¿y si lo haces en MouseUp?

+0

Buena idea, Activate() no puede arreglarlo. –

+0

Puedo intentarlo, pero no tengo grandes esperanzas en esto, porque el evento MouseDown se desencadena, puedo verlo si inserto un punto de ruptura en el código. De todos modos, como esto no ocurre constantemente, necesito algo de tiempo para probar. –

+0

Creo que tuve suficientes observaciones para afirmar que esto debería ser la solución a mi problema. Si de alguna manera el problema reaparece, lo reportaré. –

3

Así es como lo hice. Tenga en cuenta que StartupWindowState y HideWhenMinimized son miembros privados de mi formulario.

private void OnOpenTrayMenuItemClicked(object sender, EventArgs e) { 
    if (this.WindowState == FormWindowState.Minimized) { 
     this.WindowState = this.StartupWindowState; 
     this.ShowInTaskbar = 
      (this.HideWhenMinimized && (this.WindowState == FormWindowState.Minimized)) ? false : true; 
     this.Show(); 
    } 

    this.Activate(); 
} 
+0

Como respondí a continuación, no creo que esto resuelva mi problema: este es un código para poner el formulario delante de todos los formularios en su aplicación, pero no delante de todas las ventanas de todas las aplicaciones si estoy en lo cierto? –

+0

Quizás me falta algo en sus requisitos. No traerá la ventana al frente de las ventanas superiores que estén abiertas (porque evito usar 'TopMost' en mis aplicaciones). Sin embargo, cuando hago clic en el ícono de notificación, esto * parece * hacer que mi aplicación sea la activa, y el código anterior lleva la ventana al frente de todas las ventanas no superiores, incluso aquellas que no son parte de mi aplicación, sin fallar. –

+0

Estaba equivocado, expliqué que a otra respuesta similar a la tuya a continuación, de todos modos tienes razón de que esto debería funcionar, pero la razón por la que tuve un problema fue que estaba usando el evento MouseDown y no MouseUp o MouseClick como lo hiciste. –

1

Use Activate() en lugar de Show(). Además, si su formulario está minimizado, debe configurar su WindowState a WindowState.Normal (o cualquier otro estado antes de minimizar).

 

     private void notifyIcon1_Click(object sender, EventArgs e) 
     { 
      Activate(); 

      // this is needed for minimized form to show 
      WindowState = FormWindowState.Normal; 
     } 
 
+0

He intentado minimizar todas las ventanas con start + d, haga clic en notifyicon y parece funcionar (con o sin traer otra ventana al frente primero), así que supongo que no es el problema Este código que proporcionó debería funcionar si no tiene ninguna otra aplicación en ejecución que la suya, pero no creo que pueda mostrar todas las ventanas de todas las aplicaciones. –

+0

Traerá la ventana de su aplicación al frente de todas las aplicaciones. Lo he probado (Windows Vista). –

+0

Parece que MouseUp en lugar de MouseDown resolvió mi problema, pero supongo que tu código es más simple, así que también debería usarlo. No estoy seguro de si funcionaría en MouseDown, intentaré probarlo. –

0

Tuve un problema similar; una solución simple fue suficiente para mí. En el controlador de eventos donde necesito mostrar el formulario, simplemente verifico si las ventanas son visibles/normales, y si lo es, lo minimizo. El resto del código lo vuelve a subir.

private void OnDetails(object Sender, EventArgs Args) 
    { 
     if (DetailsForm == null) 
     { 
      DetailsForm = new MyForm(this); 
     } 

     if (DetailsForm.WindowState == FormWindowState.Normal) 
      DetailsForm.WindowState = FormWindowState.Minimized; 

     DetailsForm.WindowState = FormWindowState.Normal; 
     DetailsForm.Show(); 
    } 
0

probar este

Esta función funciona para mí:

public static void BringFormToFront(Form form) { 

    form.Activate(); 
    form.TopMost = true; 
    form.TopMost = false; 
    form.Focus(); 
    form.BringToFront(); 

} 

y si quieres que ser muy perezoso:

public static void ShowFormToFront(Form form) { 
    form.Show(); 
    BringFormToFront(form); 
} 

Estos podrían ser fácilmente extension methods.

Cuestiones relacionadas